我已扩展 ActiveRecord::Base
按以下方式上课:
lib
下创建了一个目录,现在就叫它foo
has_many_bidirectional
在 ActiveRecord::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
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/