为何继承ActiveRecord::Base的类无法通过class_eval定义scope?
错误原因
你获取的klass是目标类的单例类,而非目标模型类本身:
klass = class << self; self; end的作用是取出当前类的单例类,scope是ActiveRecord::Base为子类提供的类方法,仅当调用上下文的self是模型类本身时可用,在单例类的class_eval块中self指向单例类,自然找不到scope方法。- 你不需要额外操作单例类,
method_missing本身已经运行在模型类的类方法上下文,直接调用scope即可完成定义。
修正后的代码
module Mod extend ActiveSupport::Concern class_methods do # 配套重写该方法保证Rails内部方法反射逻辑正常 def respond_to_missing?(method_name, include_private = false) method_name.match?(/method/) || super end def method_missing(m, *args, &block) if m.match? /method/ # 直接在当前上下文定义scope scope m, -> {} # 调用刚生成的scope返回正确结果 send(m, *args, &block) else # 不匹配的方法走默认逻辑,避免吞掉正常报错 super end end end end
额外注意
如果需要生成的scope支持传入参数,直接修改lambda的参数定义即可。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

