我想在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。我想在范围内做这个的原因是我将把它们中的几个连在一起。
我如何使这项工作?
答案 0 :(得分:49)
要回答您的问题,您可以这样做:
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
,它将返回一个匿名范围,允许您链接查询。
最后,这取决于你。我只是给你选择。