我为我的一个模型写了一个upsert方法.我希望我的所有模型都有这种upsert方法.在我看来,逻辑解决方案是定义一个继承的模型,ActiveRecord::Base然后让我的所有其他模型继承.但是如果我这样做,Rails会抱怨我创建的新模型没有表可以使用它,这是真的,但我不在乎.
既然我尝试的方式显然不是正确的方法,那么正确的方法是什么?
您可以使用模块扩展ActiveRecord.您只能在一个地方进行,并且可以从继承ActiveRecord的所有模型访问它.
module YourModule
def self.included(recipient)
recipient.extend(ModelClassMethods)
recipient.class_eval do
include ModelInstanceMethods
end
end # #included directives
# Class Methods
module ModelClassMethods
# A method accessible on model classes
def whatever
end
end
# Instance Methods
module ModelInstanceMethods
#A method accessible on model instances
def another_one
end
end
end
#This is where your module is being included into ActiveRecord
if Object.const_defined?("ActiveRecord")
ActiveRecord::Base.send(:include, YourModule)
end
Run Code Online (Sandbox Code Playgroud)