我已阅读this,所以我明白其中的差异。Rails 4 - has_one和belongs_to投掷错误
但我继承了一个抛出奇怪行为的应用程序(我想,也许我错了,这是正常的)。
有2种型号:
class Pod < ActiveRecord::Base
has_one :pod_admin
end
class PodAdmin < ActiveRecord::Base
belongs_to :pod
end
在轨控制台,我尝试这样做:
p = Pod.find(5)
,它表明该吊舱具有pod_admin_id
值的14。这是正确的。
我试图改变PodAdmin:
p.pod_admin = PodAdmin.last
,并抛出这个错误:
NoMethodError: undefined method pod_admin_id for #<PodAdmin:0x007fa401f1e710>
这是为什么?我错过了什么?
编辑基于的意见/回答
,在不改变模型,我尝试这样做:
pa = PodAdmin.last
pa.pod = p
和这样的作品,我看到控制台返回最后PodAdmin用新pod_id。
但
pa.save
和
p.save
都抛出同样的错误了。
如果我看一下数据库模式,Pod表具有pod_admin_id字段,而PodAdmin表具有pod_id字段。
我继承了这个模式,我只是想知道原始开发者是否正确设置了这个模式。当然,我应该能够从任一方向更新关系 - 是不是创建has_one和belongs_to的关键,所以你可以有这样的双向关系?
EDIT 2
我发现这个问题,这是我已经添加了此行PodAdmin表,而不是吊舱表:
validates :pod_admin_id, uniqueness: {scope: :id, message: 'The Pod already has a PodAdmin'}
道歉 - 但正如你所看到的,是什么我想在这里实现的目的是防止Pod有2个PodAdmins。这验证似乎并没有达到。
我可以这样做:
p = Pod.find(5)
pa_last = PodAdmin.last
pa_first = PodAdmin.first
pa_last = p
pa_first = p
pa_last.save
pa_first.save
现在无论PA的具有相同pod_id。 我该如何防止这种情况发生?
编辑3
大量的阅读和测试后,并在两地@Anand和@Spickerman的问题是,以前的开发人员把一个外键到这两个表(在has_one
和belongs_to
)。只有belongs_to表应该有一个外键。此外,这种关系被定义为错误的方式。但是,解决这个问题并不能保证可靠的解决方案。我强烈建议其他类似问题的人阅读this。
你做错了。随着你的关联设置,“pod_admins”表应该有'pod_id'。 – Pavan
@Pavan是对的,你需要'pod_admins'表上的'pod_id',或'Pod'''属于':pod_admin'而'PodAdmin'' has_one:pod' –
pod_admins表有一个pod_id字段。我更新了我的问题来解释 - 似乎我无法从任何一方更新关系。 – rmcsharry