ruby-on-rails - 扩展 ActiveRecord::Base 的正确方法

标签 ruby-on-rails activerecord observer-pattern extending

我已扩展 ActiveRecord::Base按以下方式上课:

  • 我在 lib 下创建了一个目录,现在就叫它foo
  • 编写了提供额外方法的模块has_many_bidirectionalActiveRecord::Base 中具有双向 has_many 关系类(class)
  • lib/foo/active_record.rb :
    module Foo
      module ActiveRecord
        autoload :Associations, 'active_record/associations'
        autoload :Base, 'active_record/base'
      end
    end
    
  • lib/foo/active_record/base.rb :
    module Foo
      module ActiveRecord
        module Base
          def self.included(base)
            base.class_eval do
              include Associations
            end
          end
        end
      end
    end
    
  • 当然还有 lib/foo/active_record/associations.rb 中的真实代码:
    module Foo
      module ActiveRecord
        module Associations
    
          def self.included(base)
            base.extend(ClassMethods)
          end
    
          module ClassMethods
            def has_many_bidirectional(...)
              # ...
            end
          end
        end
      end
    end
    
  • 扩展ActiveRecord::Base config/environment.rb 中的类在配置文件末尾添加以下代码:
    ActiveRecord::Base.class_eval do
      include Foo::ActiveRecord::Base
    end
    
  • 通过这种方式,Rails 正确地包含在我的模块中,我可以毫无问题地使用它
  • 直到我想 观察 一个扩展类,因为在 config/environment.rb config.active_record.observers部分在扩展部分之前,并且可观察类此时对新方法一无所知。

  • 产生以下错误:
    /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1998:in `method_missing': undefined method `has_many_bidirectional' for #<Class:0x1032f2fc0> (NoMethodError)
            from .../app/models/user.rb:27
    

    我的问题是,这是扩展 ActiveRecord::Base 的正确方法类(class)? (我不想在我的 User 类中使用回调方法。)

    我真的必须在 lib 下创建一个 gem 而不是一个模块吗?目录有这个功能?

    谢谢!

    最佳答案

    当我挖掘出来时,最好的方法是使用生成器创建一个插件:

    ./script/generate plugin has_many_bidirectional
    

    通过这种方式,Rails 会将它包含在观察者部分之前。一个很好的教程可以找到here .

    我以前的所有代码都可以很容易地采用这种方式。

    关于ruby-on-rails - 扩展 ActiveRecord::Base 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501429/

    相关文章:

    ruby-on-rails - 使用 ruby​​ 2.6.5 运行 rspec 时出现whitelist_classes 错误

    mysql - 计算 Rails 中的日期列

    sql - 获取所有已标记为属于用户的任何兴趣的帖子

    android - 从数据库中成功检索数据但无法通过适配器类

    java - 线程和观察者模式。我怎样才能让一个线程通知所有其他线程并执行某个方法/事物?

    ruby-on-rails - Mongoid:搜索数组

    ruby-on-rails - Rails Assets 路径在生产中缺少指纹

    ruby-on-rails - 自定义非自动递增 ActiveRecord "id"列可能吗?

    ruby - 从 ActiveRecord 迁移中输出 SQL 而不执行它(不是 rails!)

    java - 如何从后台服务更新 Android Activity 中的信息