レールの使用3.2.3。Ruby on Rails - 複数テーブルのWHERE句
これは私を夢中にしています。私は積極的な記録がこれらのタイプの行為を簡素化することになっていることを知っていますが、私はそれの周りに頭を浮かべることはできません。
私はホテルと施設モデルを持っています。どちらもhas_and_belongs_to_manyリレーションを持っています。 ホテルには多くの施設があり、私の目標はホテルの名前/場所、評価、施設で検索することです。
最初の2つで検索できますが、施設で検索することはできません(検索フォームのチェックボックス)。
ビューコード:
<%= 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の共同テーブルにあります(そのテーブルにはhotel_idとfacility_idのキーがあります) ところで、私はすべての設備を備えたホテルを作ることができます。 2つの間の関係は正しいです。
すべてのヘルプは非常に
非常に啓発されていただきありがとうDGMありがとうございます。私は別の問題がありますが。それは と言う: "facilities_hotels"という名前の関連付けが見つかりませんでした。おそらくあなたはそれを間違って綴ったでしょうか? 抽出されたソース(ライン#72周辺):<%@ hotels.each do | hotel |%> これはなぜ起こっているのか分かりませんか?その奇妙な会合は結成されていません。 このような短い通知であなたの答えをもう一度ありがとうございます。 – Silver
あなたのhas_many呼び出しが何であるかを探します。 habtmコールの場合は、より明示的にコールする必要があります。 'joins( 'INNER JOIN facilities_hotels')' – DGM
詳細については、以下を参照してください。http://guides.rubyonrails.org/active_record_querying.html#joining-テーブル – DGM