我有一个搜索方法和两个模型,餐馆和菜单。在菜单搜索方法中,如果我搜索“鸡肉”,它会显示附近出售餐点的最近的餐馆,例如鸡肉三明治“鸡肉三明治”使用协会。问题是,如果一家餐馆出售多份鸡肉饭,餐厅会多次呈现。我希望能够一次显示餐馆,当点击按钮时,一个模态显示用名称中的“鸡”用餐,如果有的话与鸡肉多餐。我尝试添加uniq& ActiveRecord中的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%>
答案 0 :(得分:2)
我认为,您需要开始的是存在匹配菜单项的餐馆。
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进行不区分大小写的搜索。
然后,您可以列出匹配餐厅的相应菜单项。
答案 1 :(得分:0)
在讨论了聊天之后,这里有一个更新,感谢@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参数:
@dish = params[:dish]