0

モデルファイルでテーブルの関係が適切に設定されていれば、ActiveRecordがデータの更新とjunctionテーブルへの挿入を処理すると思いました。

これはそうではありませんか?

たとえば、次のようなdvd.rbモデルがあります。

  has_and_belongs_to_many :dvd_producer

ジャンクションテーブルはそれに応じて名前が付けられますdvd_producers_dvds(私は知っています、ばかげた名前ですが、それはActiveRecordが期待するものです)。

dvd_producers基本的に、次の方法で新しいプロデューサーをテーブルに挿入すると、次のようになります。

DvdProducer.create(producer: producer)

ActiveRecordが同等のデータ(producer_id、dvd_id)をjunctionテーブルに自動的に挿入することを期待します。

多分私はnew_producer.save代わりにメソッドを使用する必要がありcreateますか?

それとも、これは単なる夢のようなものですか?

4

2 に答える 2

1

DVDをdvd_producerに追加したことはありますか?私はあなたがDVDを作成するのを見ていません。

producer = DvdProducer.create(producer: producer)
producer.dvds << Dvd.create(title: title)

あなたが望むものを手に入れるべきです。

于 2012-11-18T09:14:26.520 に答える
1

完全な答えは、ジャンクションテーブルにデータを挿入する必要があるが、他のオブジェクトの1つを作成していない場合は、既存のオブジェクトを使用できるということです。

したがって、オブジェクトのジャンクションテーブルにデータを挿入するには、次のようにします。

dvd = Dvd.find(:id)
producer  = Producer.where(producer: 'some guy').first_or_create
dvd.producer << producer

もちろん、これは、上記のKrustalが指摘したようにオブジェクトを停止している場合にも機能します。

ジャンクションテーブルにデータ<<追加=し、オブジェクトを配列として使用してデータを置き換えるために使用します。

dvd.producer = [producer]

これの良いところは、多対1の関係(dvd.sound_idのように他のテーブルに外部キーとしてIDがある場合)でも、わずかな変更を加えて、次の=代わりに使用することです<<

dvd = Dvd.find(:id)
sound = Sound.where(sound: 'Dolby').first_or_create
dvd.sound = sound

また、私は今、私がfirst_or_create存在することを知らなかった中毒になっています。これは、レコードが存在しない場合に最初にレコードを検索して作成する必要がない素晴らしい方法です。私はこれについて知らなかったとは信じられません。それを使用してください、それは素晴らしいです。

于 2012-11-22T15:38:57.777 に答える