来自搜索参数的重复结果

Duplicate Results From Search Params

我有一个搜索方法和两个模型,餐厅和 menus.In 菜单搜索方法,如果我搜索 "chicken" 它会显示最近的餐厅,该餐厅以单词 chicken 为例"chicken sandwich"配合使用联想。问题是,如果一家餐厅出售多份鸡肉,则餐厅会呈现几份 times.I 希望能够显示一次餐厅,当单击按钮时,模式会显示名称中带有 "chicken" 的餐点如果有多餐鸡肉,则循环。我尝试在 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%>

经过聊天讨论,这里有一个更新,感谢@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]

我认为,您需要从有匹配菜单项的餐厅着手。

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)

保证每个餐厅 return 一排。

如果您的 RDBMS 支持,您可能需要 ILIKE 进行不区分大小写的菜肴搜索。

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