看似简单的问题。
我试图在不使用ActiveRecord::Relation
之类的方法的情况下从模型构建where()
对象。例如:
@people = Person
@people.where( status: 'active' ) if params(:active)
@people.where( is_smoker: true ) if params(:smokers)
return @people
您可以看到,如果参数中没有设置active
或smokers
,则@people只是模型,而不是ActiveRecord::Relation
。
我可以在all
结束时加注return @people
,但必须有更好的方法。
思考?
答案 0 :(得分:2)
您可以使用.scoped
方法:
@people = Person.scoped
@people.where( status: 'active' ) if params(:active)
@people.where( is_smoker: true ) if params(:smokers)
return @people
还有.unscoped
method基本上做同样的事情但忽略了所有定义的default_scopes
。
Rails 4:方法.scoped
已被弃用,请参阅@ FrederickCheung的回答
答案 1 :(得分:2)
在rails 3.x上,scoped
是可行的方法。但是,它在Rails 4中已弃用,在Rails 4.1中已删除
对于rails 4.0及更高版本,all
只返回一个范围,因此您可以改为编写
@people = Person.all
@people.where( status: 'active' ) if params(:active)
@people.where( is_smoker: true ) if params(:smokers)
return @people