如何使Rails 3动态范围有条件?

tda*_*lke 22 ruby-on-rails-3

我想在rails 3中创建一个动态命名范围,条件是传入的参数.例如:

class Message < AR::Base
  scope :by_users, lambda {|user_ids| where(:user_id => user_ids) }
end

Message.by_users(user_ids)
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够使用空数组user_ids来调用此范围,在这种情况下不应用where.我想在范围内做这个的原因是我将把这些中的几个链接在一起.

我该如何工作?

Mik*_*wis 49

要回答您的问题,您可以:

scope :by_users, lambda {|user_ids| 
  where(:user_id => user_ids) unless user_ids.empty?
}
Run Code Online (Sandbox Code Playgroud)

然而

我通常只是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
Run Code Online (Sandbox Code Playgroud)

这将在Rails 3中起作用,因为它where实际上返回一个ActiveRecord::Relation,您可以在其中链接更多查询.

我也在使用#scoped,它将返回一个匿名范围,这将允许您链接查询.

最后,这取决于你.我只是给你选择.

  • 仅供参考:在Rails 4中,`scoped`已被弃用,你应该使用`all`. (9认同)
  • 返回#scoped是我所缺少的.谢谢! (6认同)