我原以为如果在模型文件中正确设置了表关系,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
?
或者这只是一个白日梦?
答案 0 :(得分:1)
你有没有把DVD附加到dvd_producer?我甚至没有看到你创建一个类似DVD的东西。
producer = DvdProducer.create(producer: producer)
producer.dvds << Dvd.create(title: title)
应该得到你想要的东西。
答案 1 :(得分: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)以及稍微改变,使用{{1而不是=
:
<<
此外,我现在沉迷于dvd = Dvd.find(:id)
sound = Sound.where(sound: 'Dolby').first_or_create
dvd.sound = sound
,我从来不知道它存在。这是一种很棒的方法,可以使您不必首先搜索记录并在不存在的情况下创建记录。我不敢相信我不知道这件事。使用它,它很棒。