在rails应用程序中按交付区域搜索餐馆

时间:2017-07-24 22:32:20

标签: ruby-on-rails ruby search area

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

1 个答案:

答案 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>

阅读材料:

How to Save Multiple Checkbox Values to a Database in Rails

Master Many-to-Many Associations with ActiveRecord