2012-04-20 28 views
2

レールの使用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つの間の関係は正しいです。

すべてのヘルプは非常に

答えて

4

を高く評価しているあなたは追加する必要があり、それは他のテーブルに参加してもらうための句を結合します。

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

非常に啓発されていただきありがとうDGMありがとうございます。私は別の問題がありますが。それは と言う: "facilities_hotels"という名前の関連付けが見つかりませんでした。おそらくあなたはそれを間違って綴ったでしょうか? 抽出されたソース(ライン#72周辺):<%@ hotels.each do | hotel |%> これはなぜ起こっているのか分かりませんか?その奇妙な会合は結成されていません。 このような短い通知であなたの答えをもう一度ありがとうございます。 – Silver

+0

あなたのhas_many呼び出しが何であるかを探します。 habtmコールの場合は、より明示的にコールする必要があります。 'joins( 'INNER JOIN facilities_hotels')' – DGM

+0

詳細については、以下を参照してください。http://guides.rubyonrails.org/active_record_querying.html#joining-テーブル – DGM

関連する問題