2009-07-23 4 views
5

に条件を見つけ、私はのparamsなどかなりの数を扱うことができ、レールのインデックス作用を有する:動的アクティブなレコード

params[:first_name] # can be nil or first_name 
params[:age]  # can be nil or age 
params[:country] # can be nil or country 

私は希望のユーザーを見つけるし、ゼロではありませんすべての条件。これにより、検索条件の8つの順列が得られます。

私はコードを乾燥して柔軟に保つことができ、if文の束で終わることはできません。

conditions = params.only(:first_name, :age, :country) 
conditions = conditions.delete_if {|key, value| value.blank?} 

if conditions.empty? 
    User.all 
else 
    User.all(:conditions => conditions) 
end 

答えて

1

これは非常にうまく動作するようです:何の条件が指定されていない場合、私はちょうどのようなものについてはどのようにUser.all

3

戻したい心に留めておくこと

conditions = params.slice(:first_name, :age, :country) 
hash = conditions.empty? ? {} : {:conditions => conditions} 
@users = User.all hash 
+0

奇妙なことに、私のparamsハッシュは唯一の方法しかないようです –

0

あなたがAmbitionを試みることができます、 ActiveRecordの他の拡張機能を使用することもできます。

3

私は通常、このような何かのために名前のスコープを使用します。私は通常仕事だ

class User < ActiveRecord::Base 
    named_scope :name_like, lambda {|name| {:conditions => ["first_name LIKE ?", "#{name}%"]}} 
    named_scope :age, lambda {|age| {:conditions => {:age => age}}} 
    named_scope :in_country, lambda {|country| {:conditions => {:country => country}}} 
end 

class UsersController < ActionController 
    def index 
    root = User 
    root = root.name_like(params[:first_name]) unless params[:first_name].blank? 
    root = root.age(params[:age]) unless params[:age].blank? 
    root = root.country(params[:country]) unless params[:age].blank? 

    @users = root.paginate(params[:page], :order => "first_name") 
    end 
end 

0

これはジェームズ・ヒーリーの答えを使用して、あまりにも私のため

conditions = params[:search] ? params[:search].keep_if{|key, value| !value.blank?} : {} 
User.all(:conditions => conditions) 
1

を動作しますが、私は(場合にはそこに誰もがこれを必要とする)のRails 3.2で使用するコードを変更します。あなたは古代のプロジェクト(Railsの2.xの)と非常に厄介であることが起こる場合

conditions = params.slice(:first_name, :age, :country) 
conditions = conditions.delete_if {|key, value| value.blank?} 

@users = User.where(conditions) 
0

は、あなたが元のクエリに新しいフィールドを追加するために、以下のような何かを行うことができます。

オリジナルコード:

User.find(:all, 
    :conditions => ['first_name LIKE ? AND age=? AND country=?', 
     "#{name}%", age, country] 
zip_code

フィールドに新しい動的条件の追加:

zip_code = params[:zip_code] # Can be blank 
zip_query = "AND zip_code = ?" unless zip_code.blank? 

User.find(:all, 
    :conditions => ['first_name LIKE ? AND age=? AND country=? #{zip_query}', 
     "#{name}%", age, country, zip_code].reject(&:blank?) 

reject(&:blank?)conditionsにアレイの追加nil値をフィルタリングします。

注:ゼロからコーディングしている場合や、リファクタリングを行っている場合は、他の回答が優れています。

関連する問題