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的关键字) 顺便说一句,我能够创建一个酒店,其中包含所有设施想要,所以两者之间的关系是正确的。
任何帮助,高度赞赏
谢谢DGM,这非常有启发性。虽然我有另一个问题。它说 :没有找到名为'facilities_hotels'的协会;也许你拼错了吗? 提取的来源(在#72附近):<%@ hotels.each do | hotel |%> 你知道为什么会发生这种情况吗?它的奇怪的协会没有形成。 再次感谢您在如此短的时间内给出的答复。 – Silver 2012-04-20 21:39:00
它应该查找你的has_many呼叫。如果这是一个habtm调用,那么调用可能需要更明确:'joins('INNER JOIN facilities_hotels')' – DGM 2012-04-20 22:29:44
有关更多信息,请参阅:http://guides.rubyonrails.org/active_record_querying.html#joining-表 – DGM 2012-04-20 22:30:55