在 rails 应用中按送货区域搜索餐厅
Search restaurants by delivery area in a rails app
我想在 rails 应用的 ruby 中通过 delivey_area 搜索餐厅
我为区域创建了一个模型,我通过 area_id 在区域和餐厅之间建立了关系。我应该在我的代码中添加什么?
目前我只能为每个餐厅设置一个区域..但我想做的是一家餐厅必须有多个外卖区域...
这是我的餐厅表格:(我试图列出所有带有复选框的区域以允许餐厅选择送货区域)
<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
如果 "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 Thanks for your reply.. With my code searching by area_id is working but i can only set just one delivery area for each restaurant.. I want a restaurant to have many delivery areas.
回复如下:
创建多对多关系:
这将为您提供每个 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>
阅读材料:
我想在 rails 应用的 ruby 中通过 delivey_area 搜索餐厅 我为区域创建了一个模型,我通过 area_id 在区域和餐厅之间建立了关系。我应该在我的代码中添加什么? 目前我只能为每个餐厅设置一个区域..但我想做的是一家餐厅必须有多个外卖区域...
这是我的餐厅表格:(我试图列出所有带有复选框的区域以允许餐厅选择送货区域)
<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
如果 "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 Thanks for your reply.. With my code searching by area_id is working but i can only set just one delivery area for each restaurant.. I want a restaurant to have many delivery areas.
回复如下:
创建多对多关系:
这将为您提供每个 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>
阅读材料: