web-dev-qa-db-ja.com

Ruby on Rails。 :belongs to関係でActive Record .buildメソッドを使用するにはどうすればよいですか?

Railsに.buildメソッドに関するドキュメントが見つかりません(現在2.0.2を使用しています)。

実験により、いずれかのレコードが保存される前にbuildメソッドを使用してhas_many関係にレコードを追加できるようです。

例えば:

class Dog < ActiveRecord::Base
  has_many :tags
  belongs_to :person
end

class Person < ActiveRecord::Base
  has_many :dogs
end

# Rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true

これにより、犬とタグの両方が外部キーとともに適切に保存されます。これは、belongs_to関係では機能しないようです。

d = Dog.new
d.person.build # => nil object on nil.build

私も試しました

d = Dog.new
d.person = Person.new
d.save # => true

Dogの外部キーは、保存された時点ではまだ保存されていないため、新しい人にはIDがないため、この場合は設定されません。

私の質問は:

  1. Railsが適切な順序でレコードを保存する方法を見つけるのに十分なほどスマートになるように、ビルドはどのように機能しますか?

  2. belongs_to関係で同じことを行うにはどうすればよいですか?

  3. この方法に関するドキュメントはどこにありますか?

ありがとうございました

127
stellard

文書化されている場所:

Module ActiveRecord :: Associations :: ClassMethods 」のhas_manyアソシエーションの下のAPIドキュメントから

collection.build(attributes = {}、…)属性でインスタンス化され、外部キーを介してこのオブジェクトにリンクされているが、まだ保存されていないコレクションタイプの1つ以上の新しいオブジェクトを返します。注:これは、関連付けられたオブジェクトが既に存在する場合にのみ機能し、nilではありません!

反対方向の構築に対する答えは、わずかに変更された構文です。犬の例では、

Class Dog
   has_many :tags
   belongs_to :person
end

Class Person
  has_many :dogs
end

d = Dog.new
d.build_person(:attributes => "go", :here => "like normal")

あるいは

t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")

Create_dogを使用して、即座に保存することもできます(コレクションで呼び出すことができる対応する「作成」メソッドのように)

Railsはどのように十分スマートですか?それは魔法です(より正確には、私は知りません、知りたいです!)

145
BushyMark
@article = user.articles.build(:title => "MainTitle")
@article.save
47
nehpets