0

コントローラーのメソッド内のデータベースで2つの挿入操作を実行したい:

a = A.new(:dog_id => b.id, ...)
a.save
b = B.new(:cat_id => a.id , ... )
b.save

b の a の id と a の b の id が必要なため、これを行うにはどうすればよいですか?

4

2 に答える 2

2

最初に正しい関連付けを使用してモデル A + B をセットアップします

Model Cat
  has_one :dog
  accepts_nested_attributes_for :dog

Model Dog
  has_one :cat
  accepts_nested_attributes_for :cat

A の各インスタンスは 1 つの B しか持てず、その逆も同様です。2006年からの古い説明の代わりに belongs_to を使用することもできます

Accepts_nested_attributes_for を使用すると、関連付けられたモデルの属性を元のモデルのパラメーターに渡す ことができます

コントローラーでモデルのインスタンスを構築し、それらの関連付けを設定します。

this_cat = Cat.new(cat_attributes{dog_attributes})

this_cat.save!

これを行うにはいくつかの方法があることは確かですが、Aldo が言うように、質問コードをもう少し詳しく説明すると、関連付けのいくつかを明確にするのに役立ちます。

accept_nested_attributes_for を使用しない別の方法は、A と B の各インスタンスを構築し、それらの 1 つを保存し、関連付けを行ってから両方を保存することです。

this_cat = Cat.new(cat_attributes)
this_dog = Dog.new(dog_attributes)
this_dog.save!    
this_cat.dog = this_dog
this_cat.save!
this_dog.save!
于 2012-04-26T12:49:05.993 に答える
1

A、B、C?あなたは何をしようとしていますか?Category多くの犬がいるモデルとカテゴリに属する​​モデルがある場合Dogは、カテゴリがあり、新しい犬を作成するときに、を使用してカテゴリを割り当てるだけdog.category = Category.find_by_name(category_name)です。

...しかし、犬とカテゴリの間にある種の多対多の関係があると思います。その場合は、別のモデルとデータベーステーブルが必要です...

更新:それでも私には意味がありません。さらに詳細を提供してみてください...別のアイデアは、2つのオブジェクトを作成してから更新することです:

# Create the two objects
a = A.create
b = B.create
# Update a with the B id
a.dog = b
a.save
# Update b with the A id
b.cat = a
a.save

しかし、繰り返しになりますが、あなたは本当にあなたが達成しようとしていることを説明するためにあなたの答えを更新する必要があります

于 2012-04-26T12:27:30.587 に答える