我想查看我的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中执行此操作的内置方法吗?或者我该如何以编程方式执行此操作?
答案 0 :(得分:1)
ActiveRecord::Scoping::Named::ClassMethods#scope
DSL帮助器只是创建一个新方法,它不会将范围名称存储在任何地方,所以不,它不可能开箱即用。
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 上面的代码没有经过测试,我只证明它看起来不错。