我已按以下方式扩展ActiveRecord::Base
类:
lib
下创建了一个目录,我们现在就调用它foo
has_many_bidirectional
,以便在ActiveRecord::Base
类中具有双向has_many关系在lib/foo/active_record.rb
:
module Foo
module ActiveRecord
autoload :Associations, 'active_record/associations'
autoload :Base, 'active_record/base'
end
end
{li} 在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
部分之前扩展部分,以及可观察的部分class当时对新方法一无所知。产生以下错误:
/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
类的正确方法? (我不想在我的User
类中使用回调方法。)
我是否真的必须在lib
目录下创建 gem 而不是模块才能拥有此功能?
谢谢!
答案 0 :(得分:2)
当我把它挖出来时,最好的方法是使用生成器创建一个插件:
./script/generate plugin has_many_bidirectional
通过这种方式,Rails将在观察者部分之前包含它。可以找到一个很好的教程here。
我以前的所有代码都可以通过这种方式轻松采用。