1

看似简单的问题。

我正在尝试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但必须有更好的方法。

想法?

4

2 回答 2

2

您可以使用以下.scoped方法:

@people = Person.scoped

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

return @people

还有.unscoped一种方法基本上做同样的事情但忽略所有default_scopes定义。


Rails 4:该方法.scoped已弃用,请参阅@FrederickCheung 的回答

于 2014-06-06T17:11:48.053 回答
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
于 2014-06-06T17:21:19.627 回答