ruby-on-rails - view教程 - ruby on rails教程




有没有办法将命名范围合并到一个新的命名范围? (4)

@PJ :你知道,我曾经考虑过这个问题,但是把它解雇了,因为我以为我不能再链接到第三个命名范围,就像这样:

Foo.ab(x, y).c(z)

但是因为ab(x, y)返回b(y) ab(x, y)返回的任何东西,所以我认为链会起作用。 让我重新思考明显的方法!

我有

class Foo < ActiveRecord::Base
  named_scope :a, lambda { |a| :conditions => { :a => a } }
  named_scope :b, lambda { |b| :conditions => { :b => b } }
end

我想要

class Foo < ActiveRecord::Base
  named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
end

但是我宁愿以干的方式做。 我可以通过使用获得相同的效果

 Foo.a(something).b(something_else)

但不是特别可爱


重用named_scope来定义另一个named_scope

我在这里复制它为您的方便:

您可以使用proxy_options将一个named_scope回收到另一个中:

class Thing
  #...
  named_scope :billable_by, lambda{|user| {:conditions => {:billable_id => user.id } } }
  named_scope :billable_by_tom, lambda{ self.billable_by(User.find_by_name('Tom').id).proxy_options }
  #...
end

这样它可以与其他的named_scopes链接。

我在我的代码中使用它,它完美的作品。

我希望它有帮助。


至少从3.2开始有一个巧妙的解决方案:

scope :optional, ->() {where(option: true)}
scope :accepted, ->() {where(accepted: true)}
scope :optional_and_accepted, ->() { self.optional.merge(self.accepted) }

通过使它成为一个类的方法,你将无法链接到一个关联代理,如:

@category.products.ab(x, y)

另一种方法是应用此修补程序以启用named_scope的through选项:

named_scope :a, :conditions => {}
named_scope :b, :conditions => {}
named_scope :ab, :through => [:a, :b]




named-scope