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

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

2022-05-29 18:15:36

質問

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. このメソッドに関するドキュメントはどこにありますか?

ありがとうございます。

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

どこに記載されていますか。

API ドキュメントの " の has_many の関連付けのところから。 モジュール ActiveRecord::Associations::ClassMethods "です。

collection.build(attributes = {}, ...) の1つまたは複数の新しいオブジェクトを返します。 コレクションタイプの インスタンス化され、属性が付与され このオブジェクトに外部キーでリンクされた このオブジェクトは、外部キーによってこのオブジェクトにリンクされていますが、まだ を返します。注意: これは、関連するオブジェクトがすでに存在する場合にのみ機能します。 関連するオブジェクトがすでに存在する場合にのみ動作します。 でない場合のみ動作します。

逆方向の構築の答えは、構文を少し変更したものです。あなたの犬との例では

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はどうして賢いのでしょうか?それは魔法です(正確には、私が知らないだけで、ぜひ知りたいです!)。