2012-03-26 17 views
1

爲什麼A/R設計一旦發生變化就會保持更改爲關係,而不是等待保存操作? (軌3.1.4)將設置關係設爲零直接持續的結果

...

考慮準備賬面以下機型和作者:

class Book < ActiveRecord::Base 
    has_one :author 
end 

class Author < ActiveRecord::Base 
    belongs_to :book 
end 

和以下種子數據:

a = Author.new(:name => "Joe Author") 
Book.create(:title => "The Book Title", :author => a) 

...

在讀取書籍之後,可以調整標題,直到調用Book.save之前,什麼都不會持續。

但是,當您嘗試調整與作者的關係(例如將其設置爲零)時,activerecord會立即保留更改。

這看起來像其他A/R類似的實現,如mongoid設計,並重復。爲什麼A/R旨在在關係發生變化時立即對其進行更改,而不是等待保存操作?

回答

0

所以,如果你看看`一to-one關聯」,它規定下ActiveRecord::Associations documentation section "Unsaved objects and associations"

  • 分配一個對象到HAS_ONE協會自動保存對象和被替換的對象(如果有一個),以更新他們的外鍵 - 除非父對象是未保存(new_record ==真)

少貼切

  • 將對象分配給belongs_to關聯不保存對象,因爲外鍵字段屬於父對象。它也不保存父項。

所以在這種情況下,你實際上改變了Author記錄不是Book記錄。所以,即使你調用@book.save它也不會改變關係狀態(因爲Author持有外鍵)。

如果你要等到@book.save保存@book.author那麼@book對象必須保持狀態兩個old author去除book_id,和new author設置book_id