2016-04-27 8 views
2

給一兩個型號,一個has_one協會:HAS_ONE關係自動設置爲零,如果超過一個

class ShopInfo 
    belongs_to :shop 
end 

class Shop 
    has_one :shop_info 
end 


s = Shop.create 
ss1 = s.create_shop_info 

在其他一些地方我的代碼做

ss2 = s.create_shop_info 

在此之後,SS1。 shop_id被設置爲零,所以ss1現在是孤立記錄。

有沒有什麼辦法刪除以前的記錄,而不是將它們設置爲零?

+0

爲什麼不更新以前的shop_info記錄,而不是創建一個新的? – Joeyjoejoe

+0

我正試圖阻止其他開發人員創建執行此調用的孤立記錄。我可以爲隔離解決方案做到這一點,但我不會在未來的代碼中阻止其他開發人員的這種行爲。 –

回答

3

默認情況下,HAS_ONE協會執行nullify。添加dependent: :destroy解決了問題。

class Shop 
    has_one :shop_info, dependent: :destroy 
end 

只是如果有人想要更多的信息,爲HAS_ONE更換記錄ActiveRecord的代碼是這樣的:

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/associations/has_one_association.rb#L24-L51

,但如果你在聯想加入dependent選項,執行delete方法以及:

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/associations/has_one_association.rb#L7-L22

+0

這應該被接受爲答案!沒有已知的依賴選項以這種方式工作。 –

+0

,因爲這是我自己的答案,我必須等待兩天才能接受:( –

1

弗蘭,如果你看一下the has_one documentation,我想你想使用的association=方法:

協會=(副)

分配聯營對象,提取 主鍵,將其設置爲外鍵,並保存關聯對象 。爲避免數據庫不一致,即使未將新的 一個保存到數據庫,也會在分配新對象時永久刪除現有的關聯對象。

這意味着你的代碼可能看起來像......

ss2.shop_info = ShopInfo.new(...) 
+0

感謝您的建議。我發現解決方案再次閱讀文檔。不幸的是,您的解決方案並不妨礙其他開發人員嘗試執行create_shop_info調用時遇到同樣的問題。 –