我有两个班级
class Animal < ActiveRecord::Base; end
class Kitty < Animal; end
但是当我Kitty.find_by_name('Ser Pounce')
时,我发现我实际上是在查询Animals
表,尽管通过迁移创建了一个Kitty
表。
那么如何告诉rails我希望Kitty.find_by_name
查询Kitty
表而不是父Animals
表?
答案 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
的任何子类都将使用自己的表。
此方法存在轻微缺点;超级课程定义的范围不起作用。您需要通过类方法来定义它们。