2011-02-04 31 views
0

私は、各会場がエリアとタイプに属している会場モデルを持っています。私はインデックスページ上のチェックボックスで構成された2つのフォームを持っていて、どのタイプまたはエリアに属している会場記録をフィルタリングすることができます。しかし、defインデックスの最後の行だけが使用されていますが、どのようにして両方のフォームがアクティブになるように組み合わせることができますか?複数の検索を行うにはどうすればよいですか?

コントローラー:

class VenuesController < ApplicationController 

    def index 
    @venues = Venue.all(:conditions => {:area_id => params[:areas]}) 
    @venues = Venue.all(:conditions => {:venuetype_id => params[:venuetypes]}) 
    end 
end 

ビュー:

<div class="filter_options_container"> 

    <form class="filter_by_area_form", method="get"> 
    <% Area.all.each do |a| %> 
     <%= check_box_tag("areas[]", a.id) %> 
     <%= a.name %> 
    <% end %> 
    <input type="submit" value="Filter" /> 
    </form> 

    <br><br> 

    <form class="filter_by_venuetype_form", method="get"> 
    <% Venuetype.all.each do |v| %> 
     <%= check_box_tag("venuetypes[]", v.id) %> 
     <%= v.name %> 
    <% end %> 
    <input type="submit" value="Filter" /> 
    </form> 
</div> 

<div class="venue_partials_container"> 
    <%= render :partial => 'venue', :collection => @venues %> 
    <div class="clearall"></div> 
    <%= link_to 'add a new venue', new_venue_path, :class => "add_new_venue_button" %> 
</div> 

だけそうvenuetypeフォーム作品、または私が読むためにデフインデックスを変更した場合:

def index 
    @venues = Venue.all(:conditions => {:venuetype_id => params[:venuetypes]}) 
    @venues = Venue.all(:conditions => {:area_id => params[:areas]}) 
    end 

次に領域のみをフォームが動作します。フォームから領域と種類を選択してクリックした後

<div class="filter_options_container"> 
    <form class="filter_form", method="get"> 
    <fieldset class="filter_form_fieldset"> 
     <% Area.all.each do |a| %> 
     <%= check_box_tag("areas[]", a.id) %> 
     <%= a.name %> 
     <% end %> 
    </fieldset><br> 

    <fieldset class="filter_form_fieldset"> 
     <% Venuetype.all.each do |v| %> 
     <%= check_box_tag("venuetypes[]", v.id) %> 
     <%= v.name %> 
     <% end %> 
     <input type="submit" value="Filter" /> 
    </fieldset> 
    </form> 
</div> 

:に

def index 
    @venues = Venue.all(:conditions => {:venuetype_id => params[:venuetypes]}&&{:area_id => params[:areas]}) 
    end 

ビュー:IVEは読み取るためのコントローラを変更

EDIT

送信ボタンをクリックすると、URLに「/ venues?areas [] = 2 & venuetypes [] = 13」と表示されますが、領域ごとの結果のみをフィルタリングしています入力しないでください。

ありがとうございました。検索クエリを構築するための

+2

ものを使用してについてのORクエリでは? 2つの利得:1つのクエリ、1つの変数 – apneadiving

+0

'venuetypes'と' areas'パラメータの両方がサーバに送られるように、2つではなく1つのフォームだけを作るべきです。 –

+0

私はたぶん、venuの型とエリアIDをスコープに入れます。そうすれば、必要に応じて1つの行に簡単に組み合わせることができます。スコープにロジックを追加することもできます: 'scope:with_venu_type、:conditions => lambda {| x | x.nil? ? {}:{:venutype_id => x}} ' –

答えて

2

、あなたはscoped使用する可能性があります:

Railsの@Steveスミスのような2

@venues = Venue.scoped 
@venues = @venues.scoped(:conditions => { :venuetype_id => params[:venuetypes] }) if params[:venuetypes].present? 
@venues = @venues.scoped(:conditions => { :area_id => params[:areas] }) if params[:areas].present? 

という名前の作成した場合のスコープが示唆:

class Venue < ActiveRecord::Base 
    named_scope :with_type, lambda { |types| 
    types.present? ? { :conditions => { :venuetype_id => types } } : {} } 
    named_scope :with_area, lambda { |areas| 
    areas.present? ? { :conditions => { :area_id => areas } } : {} } 
end 

その後、簡単に行うことができます:

@venues = Venue.with_type(params[:venuetypes]).with_area(params[:areas]) 

Railsの3

@venues = Venue.scoped 
@venues = @venues.where(:venuetype_id => params[:venuetypes]) if params[:venuetypes].present? 
@venues = @venues.where(:area_id => params[:areas]) if params[:areas].present? 

または:

class Venue < ActiveRecord::Base 
    scope :with_type, lambda { |types| 
    types.present? ? where(:venuetype_id => types) : scoped } 
    scope :with_area, lambda { |areas| 
    areas.present? ? where(:area_id => areas) : scoped } 
end 

次に、あなたは簡単に行うことができます。

@venues = Venue.with_type(params[:venuetypes]).with_area(params[:areas]) 
+0

ありがとうございました。 – Dave