如何使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。我想在作用域内这样做的原因是我要把其中的几个链接在一起。

我如何使它工作?

你可以这样回答你的问题:

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

最后,一切都取决于你。我只是给你一些选择

相关内容

  • 没有找到相关文章

最新更新