用于处理复合记录的Rails模型

时间:2015-10-20 13:45:53

标签: ruby ruby-on-rails-3 inheritance database-normalization

第一种形式的数据库规范化是在第二个表中保存可能为空的字段,并在引用它们时将它们连接起来。 SQL看起来像这样。

SELECT A.*, DA.* FROM ANIMALS A
INNER JOIN DOG_ATTRIBUTES DA ON DA.ANIMAL_ID = A.ID

这对于大型数据库来说非常常见,因此只有狗会拥有特定于狗的属性。现在我知道这可以实现为has_one关系,例如

class Dog < Animal
  has_one :dog_attribute
end

如果它是一个只读模型,我可以将上面的SQL作为一个视图实现,只需参考我的Dog模型中的DOGS视图。

有没有办法可以将复合Dog对象(来自ANIMALS表和DOG_ATTRIBUTES表的属性)作为单个模型处理,将两者的属性放入表单中,将它们保存为一个命令并检索两者的属性?

1 个答案:

答案 0 :(得分:1)

您正在寻找多表继承(MTI)。默认情况下,Rails仅支持单表继承,但您可以为此功能安装ActiveRecord::ActsAs

  

模拟ActiveRecord模型的多表继承(MTI)。通过   默认情况下,ActiveRecord仅支持单表继承(STI)。   MTI为您提供STI的好处,但无需放置数十个   将空字段放入单个表格中。