Ruby on Rails - 多个表中的Where子句

Sil*_*ver 3 ruby-on-rails multiple-tables where where-clause

使用rails 3.2.3.

这真让我抓狂.我知道活动记录应该简化这些类型的操作,但我无法理解它.

我有一个酒店和设施模型.两者都有has_and_belongs_to_many关系.酒店可以有许多设施,我的目标是搜索酒店的名称/位置,评级和设施.

我可以通过前两个搜索但不能按设施搜索(它们是搜索表单上的复选框).

查看代码:

<%= form_tag hotels_path, :method =>'get' do%>
        <p>
            <b>Location:</b>
            <%= text_field_tag :search, params[:search]%><br /><br />


            <b>Rating:</b><br />
            <%= radio_button_tag :ranking, '5'%>5 Stars<br />
            <%= radio_button_tag :ranking, '4'%>4 Stars<br />
            <%= radio_button_tag :ranking, '3'%>3 Stars<br />
            <%= radio_button_tag :ranking, '10'%>Hostels<br /><br />


            <b>Facilities:</b><br />
            <% for facility in Facility.find(:all) %>
                <div class="field">
                    <%= check_box_tag "fc[]", facility.id%>
                    <%= facility.description %>
                </div>
            <% end %>

            <%= submit_tag "Search", :name => nil%>
        </p>
        <%end%>
Run Code Online (Sandbox Code Playgroud)

酒店控制器:

 def index
    @hotels= Hotel.search(params)

    respond_to do |format|
      format.html
      format.json { render :json => @hotels }
    end
  end
Run Code Online (Sandbox Code Playgroud)

酒店型号:

 def self.search(params)

     if params

      arel = where('city LIKE ? OR name LIKE ?', "%#{params[:search]}%", "%#{params[:search]}%")
      arel = arel.where('ranking = ?', params[:ranking]) if params[:ranking].present?
      #arel = arel.where (' = ?', params([:fc])) -> i dont know what to put here

      arel
     else
       all
     end
    end
Run Code Online (Sandbox Code Playgroud)

基本上它需要获取名称/位置,通过排名缩小它,然后通过选中的复选框缩小它.我不能得到最后一个.酒店表中的名称/位置和等级,但每个酒店的设施都在facilities_hotels联合表中(该表有关键字hotel_id和facility_id)顺便说一句,我可以创建一个拥有我想要的所有设施的酒店,所以两者之间的关系是正确的.

任何帮助都非常感谢

DGM*_*DGM 5

您需要添加一个连接子句以使其连接到另一个表.

.joins(:facilities_hotels).where('facilities_hotels.facility_id = ?', params[:fc])
Run Code Online (Sandbox Code Playgroud)