2009-07-23 123 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陳述來構建查找條件。請記住,如果沒有指定條件,我只是想回到User.all

回答

1

這似乎很好地工作:

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

如何像:

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 
+0

奇怪的是我的params哈希似乎沒有唯一的方法 – 2009-07-23 04:59:08

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中使用(如果有任何人需要這個)。

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

@users = User.where(conditions) 
0

如果你剛好是在一個古老的項目(Rails的2.X)和非常混亂,你可以不喜歡添加新領域原始查詢以下。

原始代碼:

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值。

注意:如果您從零編碼或重構,其他答案要好得多。