代码之家  ›  专栏  ›  技术社区  ›  jdfolino

ActiveRecord列表自定义范围

  •  3
  • jdfolino  · 技术社区  · 7 年前

    我想检查我的ActiveRecord类,看看它应用了哪些自定义作用域

    class MyRecord < ActiveRecord::Base
        scope :custom_scope_one, ->() { where(id: 4) }
        scope :custom_scope_two, ->() { where(id: 4) }
        scope :custom_scope_three, ->() { where(id: 4) }
    end
    

    所以我运行了一个方法 MyRecord.custom_scopes 它应该会回来 [:custom_scope_one, :custom_scope_two, :custom_scope_three]

    他们在rails 5中是内置的吗?或者我如何通过编程实现这一点?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Aleksei Matiushkin    7 年前

    这个 ActiveRecord::Scoping::Named::ClassMethods#scope DSL helper只是创建了一个新方法,它不会将作用域名称存储在任何地方,因此不可能开箱即用。

    OTOH,可以很容易地提供这样的功能:

    ActiveRecord::Scoping::Named::ClassMethods.prepend(Module.new do
      def scope(name, body, &block)
        (@__scopes__ ||= []) << name
        super
      end
    end)
    

    然后将定义类上的实例变量:

    MyRecord.instance_variable_get(:@__scopes__)
    #⇒ [:custom_scope_one, :custom_scope_two, :custom_scope_three]
    

    您还可以为这个实例变量或其他任何东西声明一个访问器。

    NB公司 上面的代码没有经过测试,我只是证明它看起来不错。