ActiveRecord列出自定义范围

时间:2018-03-31 05:06:39

标签: ruby-on-rails ruby activerecord ruby-on-rails-5

我想查看我的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]

他们是在轨道5中执行此操作的内置方法吗?或者我该如何以编程方式执行此操作?

1 个答案:

答案 0 :(得分:1)

ActiveRecord::Scoping::Named::ClassMethods#scope DSL帮助器只是创建一个新方法,它不会将范围名称存储在任何地方,所以不,它不可能开箱即用。

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 上面的代码没有经过测试,我只证明它看起来不错。