继承自另一个类和ActiveRecord :: Base

时间:2016-05-12 04:12:24

标签: ruby ruby-on-rails-4

我有两个班级

class Animal < ActiveRecord::Base; end

class Kitty < Animal; end

但是当我Kitty.find_by_name('Ser Pounce')时,我发现我实际上是在查询Animals表,尽管通过迁移创建了一个Kitty表。

那么如何告诉rails我希望Kitty.find_by_name查询Kitty表而不是父Animals表?

2 个答案:

答案 0 :(得分:4)

继承自ActiveRecord的模型是Single Table Inheritance的模式。我没有使用STI(除非你真正想要的是什么),我会使用行为mixin模式。基本上,让Animal成为一个模块并使用include,所以你有:

module Animal; end

然后

class Kitty < ActiveRecord::Base
  include Animal
end

这可能是保持每个模型表格不同并且仍保持行为风格OO的最简单方法。

答案 1 :(得分:2)

答案实际上取决于您要做的事情:共享功能,单表继承或多表继承。

您可以通过abstract_class属性覆盖默认的STI行为:

class Animal < ActiveRecord::Base
  self.abstract_class = true
end

Animal的任何子类都将使用自己的表。

此方法存在轻微缺点;超级课程定义的范围不起作用。您需要通过类方法来定义它们。