我想在rails应用程序的ruby中通过delivery_area搜索餐馆 我为区域创建了一个模型,我通过area_id在区域和餐馆之间建立了关系。我应该在代码中添加什么? 目前我可以为每家餐厅设置一个区域..但我想做的是餐厅必须有多个送货区域...
这是我的餐厅形式:(我试图用chexboxes列出所有区域,以便餐厅选择送货区域)
<div class="field">
<%= f.label :delivery_areas %>
<% Area.all.each do |area| %>
<%= check_box_tag("area", "name") %>
<%= area.name %>
<% end %>
</div>
这是我在餐厅控制器中的索引动作:
def index
@restaurants = Restaurant.all.order("created_at DESC")
if params[:area].blank?
@restaurants = Restaurant.all.order("created_at DESC")
else
@area_id = Area.find_by(name: params[:area]).id
@restaurants = Restaurant.where(:area_id => @area_id).order("created_at DESC")
end
end
这是一个链接搜索表单:
<ul>
<li class="dropdown area-dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" style="width: 440px;">
area
<span class="caret"></span>
</button>
<ul class="dropdown-menu scrollable-menu" aria-labelledby="dropdownMenu1" style="width: 440px;">
<% @areas.each do |area| %>
<li>
<%= link_to area.name, restaurants_path(area: area.name), class: "link" %>
</li>
<% end %>
</ul>
</li>
</ul>
这是我的餐厅模特:
class Restaurant < ApplicationRecord
belongs_to :area
end
这是我的区域模型:
class Area < ApplicationRecord
has_many :restaurants
end
答案 0 :(得分:0)
如果“area”是Restaurant
中的远程键列,这应该可行Restaurant.find_by_area(Area.find_by_name(params[:area]))
或者,如果您的餐厅模型中有“area_id”列,则:
Restaurant.find_by_area_id(Area.find_by_name(params[:area]).id)
您的问题中的更多信息可以帮助您获得更好的答案...
<强>更新强>
@ i5okie感谢您的回复..我的代码搜索按area_id正在运行,但我只能为每家餐厅设置一个送货区域..我希望餐厅有很多送货区域。
回复如下:
这将为每个Area.all提供一个复选框,检查它们是否在Restaurant.area_ids中被选中,否则取消选中。
## restaurant.rb
class Restaurant < ApplicationRecord
has_and_belongs_to_many :areas
end
## area.rb
class Area < ApplicationRecord
has_and_belongs_to_many :restaurants
end
## migration (for rails 5.0)
class CreateAreasRestaurants < ActiveRecord::Migration[5.0]
def change
create_table :areas_restaurants, id: false do |t|
t.belongs_to :area, index: true
t.belongs_to :restaurant, index: true
end
end
end
# in view:
<div class="field">
<%= f.label :delivery_areas %>
<%= f.collection_check_boxes :area_ids, Area.all, :id, :name do |b| %>
<div class="collection-check-box">
<%= b.check_box %>
<%= b.label %>
</div>
<% end %>
</div>
阅读材料: