Active Record辅助方法 - 使用模块与继承

时间:2016-02-10 19:09:04

标签: ruby-on-rails inheritance activerecord

假设我想定义一些可在我的ActiveRecord模型中使用的方法和助手。

一些研究告诉我有两个一般选项

模块

定义模块

module MyModule
  def foo
    # ...
  end
end

在需要时将其包含在模型中

class User < ActiveRecord::Base
  include MyModule

  before_save :foo
end

继承

定义基类

class BaseModel < ActiveRecord::Base
  # Define as abstract so AR doesn't assume there's a table named `base_models`
  self.abstract_class = true

  def foo
    # ...
  end
end

让所有模型继承自

class User < BaseModel
  include MyModule

  before_save :foo
end

每种方法的优点/缺点是什么?以一种方式做到这一点有什么特别的优势吗?有没有更多的人认为是“Rails方式”?

谢谢!

1 个答案:

答案 0 :(得分:6)

最好使用名为has的类/模块之间的关系,而不是is

或者换句话说,最好使用Module代替inheritance。这是因为后面可能的更改,如果你以后要求有2种类型的类,那么你必须创建2 BaseClasses,并让一些类从一个继承而另一个继承。< / p>

当您使用模块时,您只需包含模块,从而定义包含它的类的行为,即所谓的has行为。

为了更好地掌握代码中的优点,不熟悉代码,学习模式,并阅读Clean Code