3

我正在使用 Ruby on Rails v3.2.2,我想知道它是否是在 mixin 模块中声明Active Record 关联的有效方法。为什么?

更多的:

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

注意:我想干燥(不要重复自己)我的代码,因为与我的 Active Record 关联相关的语句对于多个模型是相同的。

4

2 回答 2

0

你可以做到,但你必须注意在一个included do...end街区内做到这一点。

在我看来,即使它不是为了 DRY 而只是为了封装行为,将模型的代码分成独立的模块也是非常值得的。

于 2012-10-03T13:49:20.803 回答
0

去做吧!关于你的问题:

  • 关于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

#...

如果你有更多的共享行为而不是“仅仅”关联,那么这种方法当然会开始变得更有意义......

于 2012-10-03T15:46:04.997 回答