Rails 3 の build と new について質問する

Rails 3 の build と new について質問する

Rails 3でドキュメントでは、build関連付けのメソッドは メソッドと同じであると説明されていますnewが、外部キーが自動的に割り当てられます。ドキュメントから直接引用します。

Firm#clients.build (similar to Client.new("firm_id" => id))

他の場所でも似たようなことを読んだことがあります。

newしかし、 (例えばパラメータなしで)使用するとsome_firm.clients.new、新しいクライアントのfirm_id関連付け自動的に作成されました。今、コンソールで結果を確認しています。

何か見落としているのでしょうか? ドキュメントが少し古くなっていますか (ありそうにありませんが)? と の違いは何buildですかnew?

ベストアンサー1

ドキュメントを少し誤解しています。はクライアント コレクションからsome_firm.client.new新しいオブジェクトを作成しているため、 を自動的にに設定できますが、ドキュメントでは を呼び出していますが、これには Firm の ID がまったく認識されていないため、を渡す必要があります。Clientfirm_idsome_firm.idClient.newfirm_id

と の唯一の違いはsome_firm.clients.new、では新しく作成されたクライアントもコレクションに追加されるsome_firm.clients.build点です。buildclients

(some_firm = Firm.new).save # Create and save a new Firm
#=> true

some_firm.clients           # No clients yet
#=> []

some_firm.clients.new       # Create a new client
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>

some_firm.clients           # Still no clients
#=> []

some_firm.clients.build     # Create a new client with build
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>

some_firm.clients           # New client is added to clients
#=> [#<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>]

some_firm.save
#=> true

some_firm.clients           # Saving firm also saves the attached client
#=> [#<Client id: 1, firm_id: 1, created_at: "2011-02-11 00:18:47", updated_at: "2011-02-11 00:18:47">] 

関連付けを通じてオブジェクトを作成する場合は、ビルドによって、オブジェクトがデータベースに保存される前であっても、メモリ内のオブジェクトが (この場合は) 一貫した状態に保持されるため、buildよりも優先されます。newsome_firm

おすすめ記事