我已閱讀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