我有两个Rails项目,我们称之为Foo和Bar。他们共享相同的模型。模型存在于Foo和Bar链接到这些文件。
在一个Foo模型中特定方法的行为需要在Bar中不同:
在项目Foo的模型/ model_a.rb中:
class ModelA
def method_a
puts "default behavior here"
end
end
项目栏中的某个地方:
class ModelA
def method_a
puts "special behavior here"
end
end
以下代码行:
x = model_a.method_a
如果没有Bar不得不弄乱Foo的模型,在一个项目中的执行方式与在另一个项目中的执行方式不同。如果Foo的模型只是一个宝石,虽然加载顺序问题会有所不同,但是可能存在类似的情况。
我的问题是:此代码段应该放在项目栏中的哪个位置?我如何保证最后加载Bar的混合,以便在项目栏中的运行时执行正确的函数?
答案 0 :(得分:2)
继承?这就是你所描述的。
如果这是Active Record,那么您可以在Bar应用程序中强制使用表名,然后在那里使用子类。
或者,但我认为这是一个黑客。创建一个名为override_model_a
的初始化程序require 'modelA'
class ModelA
# then do your initializing, or include your module here
end
Ruby确实“最后一次获胜”,所以如果您需要原始类,然后在初始化程序中覆盖它,它就会做你想要的。