140

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

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

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

私の質問は次のとおりです。

  1. Railsがレコードを正しい順序で保存する方法を理解するのに十分スマートになるように、ビルドはどのように機能しますか?

  2. どうすればbelongs_to関係で同じことをすることができますか?

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

ありがとうございました

4

2 に答える 2

155

文書化されている場所:

「 ModuleActiveRecord::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を使用して、すぐに保存することもできます(コレクションで呼び出すことができる対応する「create」メソッドと同様)。

Railsはどのようにスマートですか?それは魔法です(もっと正確に言えば、私にはわかりませんが、知りたいです!)

于 2009-04-24T02:17:19.233 に答える
52
@article = user.articles.build(:title => "MainTitle")
@article.save
于 2010-12-15T16:01:25.663 に答える