1. ホーム
  2. ruby-on-rails

[解決済み] Rails 3 のビルドと新規作成

2022-07-22 18:08:56

質問

Rails 3では ドキュメント では build メソッドは、アソシエーションのための new メソッドと同じで、外部キーが自動的に割り当てられると説明されています。ドキュメントからそのまま引用します。

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

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

しかし、私が new (例えば some_firm.clients.new をパラメータ無しで実行した場合)、 新しいクライアントの firm_id の関連付けを行います。 が自動的に作成されます。今、コンソールで結果を見つめていますよ。

私は何かを見逃しているのでしょうか?ドキュメントが少し古くなっている (可能性は低い) のでしょうか? の違いは何ですか? buildnew ?

どのように解決するのですか?

ドキュメントを少し読み間違えています。 some_firm.client.new は新しい Client オブジェクトを作成するので、自動的に firm_idsome_firm.id を呼び出しているのに対し、docsでは Client.new を呼び出しており、これはファームの ID を全く知らないため、ファームの ID のために firm_id が渡される必要があります。

の唯一の違いは some_firm.clients.newsome_firm.clients.build は、どうやら build は、新しく作成されたクライアントを clients コレクションに追加します。

henrym:~/testapp$ rails c
Loading development environment (Rails 3.0.4)
r:001 > (some_firm = Firm.new).save # Create and save a new Firm
#=> true 
r:002 > some_firm.clients           # No clients yet
#=> [] 
r:003 > some_firm.clients.new       # Create a new client
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 
r:004 > some_firm.clients           # Still no clients
#=> [] 
r:005 > some_firm.clients.build     # Create a new client with build
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 
r:006 > some_firm.clients           # New client is added to clients 
#=> [#<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>] 
r:007 > some_firm.save
#=> true 
r:008 > 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 よりも優先されるべきです。 new の方が望ましいでしょう。 some_firm (この場合) を、オブジェクトがデータベースに保存される前であっても、一貫した状態で維持します。