是在 mixin 模块中声明活动记录关联的有效方法



>我正在使用Ruby on Rails v3.2.2,我想知道这是否是在mixin模块中声明活动记录关联的有效方法。为什么?

更多:

  1. 这种方法的优点和缺点是什么?
  2. 有什么需要注意的吗?
  3. 有什么处方可以做到这一点吗?

注意:我想 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 而只是为了封装行为,将模型的代码分离到独立的模块中也是非常值得的。

最新更新