我正在使用 Ruby on Rails v3.2.2,我想知道它是否是在 mixin 模块中声明Active Record 关联的有效方法。为什么?
更多的:
- 这种方法的优点和缺点是什么?
- 有什么需要注意的吗?
- 有什么处方可以做到吗?
注意:我想干燥(不要重复自己)我的代码,因为与我的 Active Record 关联相关的语句对于多个模型是相同的。
我正在使用 Ruby on Rails v3.2.2,我想知道它是否是在 mixin 模块中声明Active Record 关联的有效方法。为什么?
更多的:
注意:我想干燥(不要重复自己)我的代码,因为与我的 Active Record 关联相关的语句对于多个模型是相同的。
你可以做到,但你必须注意在一个included do...end
街区内做到这一点。
在我看来,即使它不是为了 DRY 而只是为了封装行为,将模型的代码分成独立的模块也是非常值得的。
去做吧!关于你的问题:
关于1:最大的好处是你有一个干净的代码库,没有重复的代码;我能想到的最大缺点是,对于查看您的代码的人来说,它可能不会立即显而易见。
关于 3:您必须在included
回调中定义关联或为其使用新ActiveSupport::Concern
扩展。
例子:
# using the standard include callback
module LocationAwareness
def self.included(base)
base.has_one :location
end
end
或者
# using ActiveSupport::Concern
module LocationAwareness
extend ActiveSupport::Concern
included do
base.has_one :location
end
end
然后你可以像这样在你的模型中使用它:
class Person < ActiveRecord::Base
include LocationAwareness
end
class Gig < ActiveRecord::Base
include LocationAwareness
end
#...
如果你有更多的共享行为而不是“仅仅”关联,那么这种方法当然会开始变得更有意义......