0

私は RoR の初心者で、Rails 3.2.3 と Ruby 1.8.7 を使用しています。

このフォーラムは私が進歩するのに役立ちましたが、1 つのことで混乱しています。

私のアプリは、チェックされているチェックボックスに応じて結果を検索できるようになっています。私の場合、ユーザーが特定の施設をチェックして「検索」をクリックすると、それらの施設のみを含む対応するホテルが返されるはずです。

名前・場所、レーティングで検索できるのですが、施設が検索できません。

簡単に言うと、私のコントローラーは次のようになります。

def index
    @hotels= Hotel.search(params)
(...)
end

私の見解は次のとおりです。

<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%>
(...)
<% @hotels.each do |hotel|%>
    <h2> <%= link_to hotel.name, hotel  %> </h2>

私のホテルと施設は、すべてが機能している has_many_and_belongs_to 関係です。ファシリティ ホテル テーブルは、ファシリティ ID 列とホテル ID 列で作成され、ファシリティ テーブルには、ファシリティ ID と説明 (プール、24 時間ルーム サービスなど) の列があります。

問題は私のモデルにあります:

def self.search(params)

     if params
           arel = where('#searches for names/location/rating')

        if params[:fc].present?
          arel=arel.joins('INNER JOIN facilities_hotels ON hotels.id=facilities_hotels.hotel_id ')

          for i in params[:fc].size
            arel=arel.where('facilities_hotels.facility_id = ?', params([:fc][i])) 
                #how do I increment on the previous line? Obviously params([:fc][i]) does not work
          end
          arel
        else
           arel
        end


     else
       all
     end

to_sqlでこれをやりたくなかった...

また、それを実行すると、施設のチェックボックスをオンにすると、クエリは常に空の結果を返しますが、それは私のモデルのコード行の問題かもしれませんが、問題を予見する場合は、この問題に関連する将来のコードの競合

前もって感謝します

4

1 に答える 1

2

これがあなたの問題です。 where チェーンは where 条件を「 AND 」でマージします。development.log ファイル、または TDD を実行している場合は test.log を確認してください (そうするべきです)。これにより、SQL ActiveRecord が生成されます。(チェックボックスを 1 つだけオンにすると、うまくいくと思います。)

まず、params[:fc] がチェックボックスの配列であるという仮定を確認してください。私はよく例外をスローし、ブラウザーに返されたページを確認します。

def self.search(params)
  raise params[:fc].inspect

これがあなたが考えている配列である場合、where メソッドは次のようになります。

where('facilities_hotels.facility_id in (:fc_list)', :fc_list => params[:fc])

コーディングのヒントとして、次のコードがきれいだと思うかどうかを検討してください。

def self.search(params)
  if params && params[:fc].present?
    joins('INNER JOIN facilities_hotels ON hotels.id=facilities_hotels.hotel_id ').
      where('facilities_hotels.facility_id in (:fc_list)', :fc_list => params[:fc])
  else
    Hotel
  end
end
于 2012-04-23T18:53:18.987 に答える