>我正在使用Ruby on Rails v3.2.2,我想知道这是否是在mixin模块中声明活动记录关联的有效方法。为什么?
更多:
- 这种方法的优点和缺点是什么?
- 有什么需要注意的吗?
- 有什么处方可以做到这一点吗?
注意:我想 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
#...
当然,如果你有更多的共同行为而不是"仅仅"关联,这种方法就会变得更有意义......
这样做,但你必须注意在included do...end
块中做到这一点。
在我看来,即使它不是为了 DRY 而只是为了封装行为,将模型的代码分离到独立的模块中也是非常值得的。