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がないため、この場合は設定されません。
私の質問は:
Railsが適切な順序でレコードを保存する方法を見つけるのに十分なほどスマートになるように、ビルドはどのように機能しますか?
belongs_to
関係で同じことを行うにはどうすればよいですか?
この方法に関するドキュメントはどこにありますか?
ありがとうございました
文書化されている場所:
「 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はどのように十分スマートですか?それは魔法です(より正確には、私は知りません、知りたいです!)
@article = user.articles.build(:title => "MainTitle")
@article.save