代码之家  ›  专栏  ›  技术社区  ›  James A. Rosen

有没有一种方法可以将命名作用域组合成一个新的命名作用域?

  •  9
  • James A. Rosen  · 技术社区  · 17 年前

    我有

    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)
    

    但它不是特别可爱。

    6 回复  |  直到 7 年前
        1
  •  2
  •   PJ.    17 年前

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

    scope :optional, ->() {where(option: true)}
    scope :accepted, ->() {where(accepted: true)}
    scope :optional_and_accepted, ->() { self.optional.merge(self.accepted) }
    
        2
  •  7
  •   Meta Lambda    10 年前

    好吧,我还是rails的新手,我不确定你在这里到底是为了什么,但如果你只是为了代码重用,为什么不使用常规的类方法呢?

    
            def self.ab(a, b)
                a(a).b(b)
            end
        

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

    如果我完全偏离了你想做的事情,请告诉我。

        3
  •  1
  •   s-andringa    16 年前

    通过将其设置为类方法,您将无法将其链接到关联代理,例如:

    @category.products.ab(x, y)
    

    另一种选择是应用 this patch 要为named_scope启用:through选项:

    named_scope :a, :conditions => {}
    named_scope :b, :conditions => {}
    named_scope :ab, :through => [:a, :b]
    
        4
  •  1
  •   Community CDub    8 年前

    是的 Reusing named_scope to define another named_scope

    为了您的方便,我复制到这里:

    您可以使用proxy_options将一个named_scope回收到另一个names_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_scope链接。

    我在代码中使用了它,它工作得很好。

    我希望这能有所帮助。

        5
  •  0
  •   Community CDub    8 年前

    @ PJ :你知道吗,我考虑过,但驳回了,因为我认为我以后不能再上链子了 第三 命名范围,如下所示:

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

    但自从 ab(x, y) 返回任何东西 b(y) 会回来的,我认为这个链条会起作用。让我重新思考显而易见的事情!

        6
  •  0
  •   aceofspades    15 年前

    查看:

    http://github.com/binarylogic/searchlogic

    令人印象深刻!

    具体来说:

    class Foo < ActiveRecord::Base
      #named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
      # alias_scope, returns a Scope defined procedurally
      alias_scope :ab, lambda {
        Foo.a.b
      }
    end