在 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>

阅读材料:

How to Save Multiple Checkbox Values to a Database in Rails

Master Many-to-Many Associations with ActiveRecord