2015-10-20 62 views
2

数据库规范化的第一种形式是在第二个表中保存可能为空的字段,并在引用它们时将其加入。 SQL看起来像这样。用于处理复合记录的Rails模型

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对象(来自ANIMALS表和DOG_ATTRIBUTES表的属性)作为单个模型对待,将两者的属性放置到窗体中,将它们保存为一个命令并检索两者的属性?

+0

您的查询不说什么'A'别名指。 – onebree

+1

感谢您告诉我,我已经更新了。 – AJFaraday

+0

你能澄清你的问题吗?我不知道你是否希望'Dog'是'Animal'的一个子类(意思是说,它接受所有的动物方法/ attr),或者如果你希望它独立于长期。你现在的模型说你有一张表“animals”,里面有一个'type'列(其中一个选项是'dog')。从那里,你有另一个名为'dog_attributes'的模型/表。 – onebree

回答

1

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

模拟ActiveRecord模型的多表继承(MTI)。默认情况下,ActiveRecord默认为 ,仅支持单表继承(STI)。 MTI为您提供了STI的好处,但不必把空字段的几十 成一个单一的table.`