来自搜索参数的重复结果
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 进行不区分大小写的菜肴搜索。
然后您可以为匹配的餐厅列出相应的菜单项。
我有一个搜索方法和两个模型,餐厅和 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 进行不区分大小写的菜肴搜索。
然后您可以为匹配的餐厅列出相应的菜单项。