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

时间:2011-04-21 19:00:23

标签: 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)

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

我如何使这项工作?

1 个答案:

答案 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,它将返回一个匿名范围,允许您链接查询。

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