You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:51:03