2009-07-23 126 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值。

注意:如果您从零编码或重构,其他答案要好得多。