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

Jam*_*sen 7 named-scope ruby-on-rails rails-activerecord

我有

class Foo < ActiveRecord::Base
  named_scope :a, lambda { |a| :conditions => { :a => a } }
  named_scope :b, lambda { |b| :conditions => { :b => b } }
end
Run Code Online (Sandbox Code Playgroud)

我想要

class Foo < ActiveRecord::Base
  named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
end
Run Code Online (Sandbox Code Playgroud)

但我宁愿以干燥的方式做这件事.我可以通过使用获得相同的效果

 Foo.a(something).b(something_else)
Run Code Online (Sandbox Code Playgroud)

但它并不是特别可爱.

Met*_*bda 9

至少从3.2开始就有一个聪明的解决方案:

scope :optional, ->() {where(option: true)}
scope :accepted, ->() {where(accepted: true)}
scope :optional_and_accepted, ->() { self.optional.merge(self.accepted) }
Run Code Online (Sandbox Code Playgroud)


PJ.*_*PJ. 2

好吧,我对 Rails 还很陌生,我不确定你到底要做什么,但如果你只是为了代码重用,为什么不使用常规的类方法呢?


        def self.ab(a, b)
            a(a).b(b)
        end
    
Run Code Online (Sandbox Code Playgroud)

您可以通过采用 *args 而不是 a 和 b 来使其更加灵活,然后可以将其中之一设为可选。如果你陷入了named_scope,你不能扩展它来做同样的事情吗?

如果我完全不同意你想做的事情,请告诉我。