我想在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
,它将返回匿名作用域,这将允许您链接查询。最后,取决于您。我只是给你选择。
关于ruby-on-rails-3 - 如何使Rails 3动态范围成为条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748550/