Ruby on rails 有人看错桌子了吗

Ruby on rails 有人看错桌子了吗,ruby-on-rails,has-one,Ruby On Rails,Has One,我正在尝试设置一个在RoR中有一个关系的。协议有一个联系人。在协议表中有一列名为contact\u id 当我尝试这样调用协议的联系人时:(contact table有一列name),我得到了错误未知列“contacts.agreement\u id”,它应该在哪里查找协议。contact\u id 有什么建议吗?您的联系人表需要添加外键迁移,也就是说,您需要创建一个列协议id,作为整数。确保您执行了rake db:migrate 请记住,FK位于关系的“属于”表一侧。因此,协议有一个联系人,联

我正在尝试设置一个在RoR中有一个关系的
。协议有一个联系人。在协议表中有一列名为
contact\u id

当我尝试这样调用协议的联系人时:
(contact table有一列
name
),我得到了错误
未知列“contacts.agreement\u id”
,它应该在哪里查找
协议。contact\u id


有什么建议吗?

您的
联系人表需要添加外键迁移,也就是说,您需要创建一个列
协议id
,作为整数。确保您执行了rake db:migrate


请记住,FK位于关系的“属于”表一侧。因此,协议有一个联系人,联系人属于协议;外键必须始终位于“属于”另一个模型的模型的表中

然而,对你来说,最好的答案可能是颠倒关系:也就是说,你确定协议不属于某个联系人,而不是只有一个联系人吗?如果切换关系,rails将正确地知道在agreements表中查找外键,而不是contact表


关于
有一个
属于

之间的选择很有趣。这会导致许多不同的表都有联系人这一事实出现问题吗?如果许多表都有联系人,则需要在联系人的
所属的
上设置多态关联。在联系人模型中,
属于\u-to:contactable,:多态=>true
。然后在协议模型中:
有一个:contact,:as=>:contactable
。您还需要向联系人模型添加一个新列
contactable\u type
(保存关联的类名),并将
agreement\u id
重命名为
contactable\u id
。阅读Rails指南中关于关联的更多信息。Rob的观点很好-我只为OP提供了“让它工作”的解决方案,而没有提供更好的方法<代码>拥有一个
是一种“设计”的味道,我很讨厌。通过
,我宁愿坚持更灵活的
方法