【问题标题】:Duplicate Results From Search Params搜索参数的重复结果
【发布时间】:2016-07-07 18:49:37
【问题描述】:

我有一个搜索方法和两个模型,餐馆和菜单。在菜单搜索方法中,如果我搜索“鸡肉”,它会显示离卖餐地点最近的餐馆,其中包含单词“鸡肉”示例“鸡肉三明治”使用关联。问题是,如果一家餐厅出售多份鸡肉餐,则该餐厅会多次呈现。我希望能够显示一次餐厅,当单击按钮时,一个模式会显示名称中带有“鸡肉”的餐点,如果有的话是多餐鸡肉。我尝试在 ActiveRecord 和控制器中添加 uniq & uniq(&:restaurant_id) 并尝试使用 sql 进行“DISTINCT”,但没有。

控制器

def search_for_menus
    #@restaurant= Menu.restaurant.all
    @menus = Menu.search_for_menus(params)
  end

菜单模型

belongs_to :restaurant
  reverse_geocoded_by "restaurants.latitude", "restaurants.longitude"

  def self.search_for_menus(params)

    menus=Menu.where("dish LIKE ?", "%#{params[:dish]}%") if params[:dish].present?
    menus = menus.where("menus.price <=?",params[:max ])
    menus = menus.where("menus.price >=?",params[:min ])

    menus= menus.joins(:restaurant).near(params[:location],2)

   menus  
  end
end

搜索页面 HTML

    <% if @menus.present? %>
<%@menus.each do |menu| %>
    <br>
    <br>


<div id ="restaurants">
    <div class="box">
      <div class="thumbnail box-image">

            <%= link_to (image_tag (menu.restaurant.thumbnail.url(:medium))),restaurant_path(menu.restaurant),'data-no-turbolink' => true%>  

      <div class="caption">
        <h3 class="text-center"><%=menu.restaurant.name%></h3>

        <p class="text-center"><a href="#" class="btn btn-primary text-center" role="button" data-toggle="modal" data-target="#modal-<%= menu.id %>">View Food</a></p>
      </div>
    </div>

          </div>

<div id="modal-<%= menu.id %>" class="modal fade bs-example-modal-sm" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
    <div class="modal-body">
    <div class="col-md-6">
      <p><%= menu.dish %></p>
      </div>
      <div class="col-md-6">
      <p><%= menu.price %></p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">OK</button>

      </div>
    </div>
  </div>
</div>
</div>



<%end%>



</div>




<%else%>

<p>no posts</p>

<%end%>

【问题讨论】:

  • 该菜单是否属于超过 1 家餐厅?请注意,如果 params[:dish] 不存在,这将完全中断。
  • 每条菜单记录都属于特定的餐厅,因此 ID 为 1 的菜单属于 ID 为 33 的餐厅, ID 为 3 的菜单可以属于 ID 为 35 的餐厅。感谢您提供这道菜的小费,我们会更改跨度>

标签: ruby-on-rails ruby web-deployment


【解决方案1】:

我认为,您需要从存在匹配菜单项的餐厅开始。

restaurants = Restaurant.near(params[:location],2).
                         where(Menu.where("menus.restaurant_id = restaurants.id").
                                    where("dish LIKE ?", "%#{params[:dish]}%").
                                    where("menus.price <=?",params[:max ]).
                                    where("menus.price >=?",params[:min ]).exists)

这保证每家餐厅返回一行。

如果您的 RDBMS 支持,您可能希望 ILIKE 用于不区分大小写的菜肴搜索。

然后,您可以为匹配的餐厅列出相应的菜单项。

【讨论】:

  • 谢谢@David,我希望你不介意我使用该查询来更新帖子。
  • @David 经过一些测试,我发现一些食物搜索给出了不出售搜索到的食物的餐厅,而且当我在近距离方法中增加距离时,它显示更多不相关的餐厅,似乎如果 ("dish LIKE ?", "%#{params[:dish]}%") 的 where 条件没有过滤不匹配的结果,是否对代码进行任何修改可以解决此问题?
  • 这是从服务器生成的 SQL 的链接,以及我在控制台中手动生成的 SQL link
  • @user3110815 啊,是的,它缺少菜单和餐厅表之间的关键连接。
【解决方案2】:

在聊天讨论之后,这里有一个更新,感谢@David 的询问。

菜单型号:

  belongs_to :restaurant
  reverse_geocoded_by "restaurants.latitude", "restaurants.longitude"

  def self.search_for_restaurants(params)
    Restaurant.near(params[:location],2).
                         where(Menu.where("dish LIKE ?", "%#{params[:dish]}%").
                                    where("menus.price <=?",params[:max ])
                                    where("menus.price >=?",params[:min ]).exists)
  end

把它放在餐厅模型中(在这里你要为视图获取所有匹配的菜单):

def search_for_matching_menus dish
  menus.where("dish LIKE ?", "%#{dish}%")
end

视图(你必须根据你的需要调整它,我只是想让你理解这个想法):

<% if @restaurants.present? %>
  <%@restaurants.each do |restaurant| %>
    <br></br>
    <br></br>
    <div id ="restaurants">
      <div class="box">
        <div class="thumbnail box-image">
          <%= link_to (image_tag (restaurant.thumbnail.url(:medium))),restaurant_path(restaurant),'data-no-turbolink' => true%>  
          <div class="caption">
            <h3 class="text-center"><%=restaurant.name%></h3>
            <%= restaurant.search_for_matching_menus(@dish).each do |menu| %>
              <%= menu.id %>
            <% end %>
          </div>
        </div>
      </div>
  <%end%>
<%end%>

最后这必须在调用搜索的控制器上进行,以转发菜参数:

@dish = params[:dish]

【讨论】:

  • 我在想,能不能把这个生成的SQL粘贴到你的控制台上?谢谢
  • 请用更新后的代码再次测试一下,抱歉,有点棘手,因为我无法运行它。谢谢! @user3110815
  • 明白了,更新后的代码不起作用“你是说附近的吗”错误出现然后如果我尝试附近的我会得到一个合并错误。 .distinct 和 .uniq 的 sql 似乎是相同的。然后页面使用正确的 id 加载正确的餐厅。这里是使用 .distinct 和 .uniq link 呈现的 sql
  • 好的,只是为了确保我理解您在这里所做的事情。我们正在更改的这个方法返回一个菜单数组,对吗?您正在展示并试图使其与众不同的是餐厅,对吗?如果是,请同时发布您用于渲染的代码以便更好地理解。@user3110815
  • 是的,一系列菜单被链接起来,然后最后一行基本上是返回 menus.restaurant,其中餐厅的地址靠近输入的参数。更新帖子以显示 html.erb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多