无需任何方法或使用`all()`生成ActiveRecord :: Relation

时间:2014-06-06 17:03:45

标签: ruby-on-rails ruby activerecord activerecord-relation

看似简单的问题。

我试图在不使用ActiveRecord::Relation之类的方法的情况下从模型构建where()对象。例如:

@people = Person

@people.where( status: 'active' ) if params(:active)
@people.where( is_smoker: true )  if params(:smokers)

return @people

您可以看到,如果参数中没有设置activesmokers,则@people只是模型,而不是ActiveRecord::Relation

我可以在all结束时加注return @people,但必须有更好的方法。

思考?

2 个答案:

答案 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