我想在rails 3中根据传入的参数设置一个动态命名的作用域。例如:
class Message < AR::Base
scope :by_users, lambda {|user_ids| where(:user_id => user_ids) }
end
Message.by_users(user_ids)
然而,我希望能够调用这个作用域,即使是一个空的user_ids数组,在这种情况下,不应用where。我想在作用域内这样做的原因是我要把其中的几个链接在一起。
我如何使它工作?
你可以这样回答你的问题:
scope :by_users, lambda {|user_ids|
where(:user_id => user_ids) unless user_ids.empty?
}
然而我通常只使用scope
进行简单的操作(为了可读性和可维护性),之后的任何操作我都只使用类方法,所以像:
class Message < ActiveRecord::Base
def self.by_users(users_id)
if user_ids.empty?
scoped
else
where(:user_id => users_id)
end
end
end
这将在Rails 3中工作,因为where
实际上返回ActiveRecord::Relation
,其中您可以链接更多查询。
我也使用#scoped
,它将返回一个匿名范围,这将允许您链接查询。
最后,一切都取决于你。我只是给你一些选择