2012-03-26 7 views
1

なぜA/Rは変更が保存されるのを待たずに、の関係の変更をただちに保持するように設計されていますか?nilに関係を設定すると即座に永続化されます

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) 

...

...

次の書籍のためのモデルと著者を考えてみましょう(3.1.4レール)

ブックをフェッチするとタイトルを調整でき、Book.saveが呼び出されるまで何も保持されません。

ただし、Authorとの関係を調整しようとすると(たとえば、それをnilに設定する)、activerecordは変更をただちに維持します。

これは設計されているようで、mongoidのような他のA/Rのような実装によって繰り返されます。 A/Rは、変更が保存されるのを待つのではなく、変化の直後に変更を永続化するように設計されているのはなぜですか?

答えて

0

あなたは `一対一会」の下にActiveRecord::Associations documentation section "Unsaved objects and associations"をチェックアウトするのであれば、それは述べている:

  • をhas_oneの関連にオブジェクトを割り当てると、自動的にオブジェクトとオブジェクトが交換されることを保存します(もし一つは自分の外部キーを更新するために、)がある - ?親オブジェクトは、(new_record == true)に保存されていない場合を除いて

とあまり意義が

  • 外部キーフィールドが親に属しているため、belongs_to関連付けにオブジェクトを割り当てるとオブジェクトが保存されません。親も保存しません。

したがって、このような状況で、あなたは実際にAuthor記録ではないBookレコードを変更しています。したがって、@book.saveを呼び出しても、関係のステータスは変更されません(Authorは外部キーを保持しているため)。

あなたが@book.authorを保存するために@book.saveまで待つとしたら、その後@bookオブジェクトは、しなければならないbook_idを除去し、new authorbook_idを設定するold author両方の状態を保持します。

関連する問題