0

我原以为如果在模型文件中正确设置了表关系,ActiveRecord 会负责更新数据并将数据插入到联结表中。

不是这样吗?

例如,我有一个看起来像这样的 dvd.rb 模型:

  has_and_belongs_to_many :dvd_producer

连接表被相应地命名dvd_producers_dvds(我知道,愚蠢的名字,但这是 ActiveRecord 所期望的)。

基本上,当我通过以下方式将新生产者插入dvd_producers表中时:

DvdProducer.create(producer: producer)

我希望 ActiveRecord 会自动将等效数据(producer_id、dvd_id)插入到联结表中。

也许我需要使用该new_producer.save方法而不是create

或者这只是一个白日梦?

4

2 回答 2

1

完整的答案是,如果您需要将数据插入联结表但不创建其他对象之一,则可以使用现有对象。

因此,要将数据插入到您已经拥有的对象的联结表中:

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

当然,如果您如上面 Krustal 所指出的那样吃掉物体,这也有效。

用于<<将数据添加到联结表并=与对象一起用作数组来替换数据:

dvd.producer = [producer]

这样做的好处是它适用于多对一关系(在另一个表中您有一个 ID 作为外键,如 dvd.sound_id)以及稍作更改,使用 a=而不是<<

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

此外,我现在沉迷于first_or_create我从未知道存在的东西。这是一种绝妙的方法,可以让您不必先搜索记录并在它不存在时创建它。我不敢相信我不知道这件事。使用它,它很棒。

于 2012-11-22T15:38:57.777 回答
1

您是否曾经将 dvd 附加到 dvd_producer?我什至没有看到你制作 DVD 之类的东西。

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

应该得到你想要的。

于 2012-11-18T09:14:26.520 回答