2012-04-20 47 views
2

使用rails 3.2.3。Ruby on Rails - 多个表中的Where子句

这让我疯狂。我知道积极的记录应该是为了简化这些类型的行动,但我无法理解它。

我有一个酒店和设施模型。两者都有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%> 

酒店控制器:

def index 
    @hotels= Hotel.search(params) 

    respond_to do |format| 
     format.html 
     format.json { render :json => @hotels } 
    end 
    end 

酒店模型:

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 

基本上它需要获取的名称/位置,由排名,然后缩小它通过选定的复选框缩小范围。我无法得到最后一个。名称/位置和评级在酒店表中,但每家酒店的设施都在facilities_hotels关节表中(该表具有酒店标识和facility_id的关键字) 顺便说一句,我能够创建一个酒店,其中包含所有设施想要,所以两者之间的关系是正确的。

任何帮助,高度赞赏

回答

4

您需要添加一个连接子句,以获得它加入到另一个表。

.joins(:facilities_hotels).where('facilities_hotels.facility_id = ?', params[:fc]) 
+0

谢谢DGM,这非常有启发性。虽然我有另一个问题。它说 :没有找到名为'facilities_hotels'的协会;也许你拼错了吗? 提取的来源(在#72附近):<%@ hotels.each do | hotel |%> 你知道为什么会发生这种情况吗?它的奇怪的协会没有形成。 再次感谢您在如此短的时间内给出的答复。 – Silver 2012-04-20 21:39:00

+0

它应该查找你的has_many呼叫。如果这是一个habtm调用,那么调用可能需要更明确:'joins('INNER JOIN facilities_hotels')' – DGM 2012-04-20 22:29:44

+0

有关更多信息,请参阅:http://guides.rubyonrails.org/active_record_querying.html#joining-表 – DGM 2012-04-20 22:30:55