Rails 3自动将数据插入到联结表中

时间:2012-11-15 11:37:26

标签: activerecord ruby-on-rails-3.2 padrino

我原以为如果在模型文件中正确设置了表关系,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

或者这只是一个白日梦?

2 个答案:

答案 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 ,我从来不知道它存在。这是一种很棒的方法,可以使您不必首先搜索记录并在不存在的情况下创建记录。我不敢相信我不知道这件事。使用它,它很棒。