ActiveRecord-如何在保存所有对象之前将(未保存)父对象的(未保存)子对象与另一个对象相关联

时间:2018-11-16 07:50:16

标签: ruby-on-rails activerecord activerecord-relation

我对Rails和Ruby比较陌生,遇到了以下问题。

我有3个对象:

  1. 名为Partner的父对象

    • 有很多Tariffs
  2. 名为Tariff的对象
    • 属于Partner
  3. 第三个对象与名为User的子对象有一个关系
    • 属于Tariff

当我创建新的合作伙伴(partner = Partner.new)和新的关税(tariff = Tariff.new)并将关税添加到合作伙伴(Partner.tariffs << tariff)时,我可以通过通过执行partner.save!与IT关系。

但是在我的情况下,我也从数据库(user = User.find.last)获得了一个用户,并希望在将所有内容保存到数据库之前直接添加与关税的关联。这是因为我想在1个事务中保存/更新所有内容,以便在发生错误时对所有内容进行角色支持。

我尝试了多种方法来实现这一目标,但我无法完成。我以为会是这样:

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff
user = User.find.last
user.tariff = tariff

ActiveRecord::Base.transaction.do
  partner.save!
  user.save!
end

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff
user = User.find.last
user.tariff = tariff

ActiveRecord::Base.transaction.do
  partner.save!
  user.save!
end

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff
user = User.find.last
user.tariff_id = tariff.id (or something similar) 

ActiveRecord::Base.transaction.do
  partner.save!
  user.save!
end

我了解我的一些案例/示例无法工作,因为没有tariff.id,也没有partner.tariff.last,只要对象没有保存到数据库中即可。

如果有人能帮助我,那就太好了,谢谢!

1 个答案:

答案 0 :(得分:0)

我这样解决了我的问题:

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff

ActiveRecord::Base.transaction.do
  partner.save!
  user.update_attributes(:tariff_id => tariff.id)
end

之所以有用,是因为关税对象在调用save方法后有了一个主意。当伙伴被保存时,关税也被保存,因为孩子是伙伴的新对象和第一级孩子。不幸的是,孩子的孩子不会自动保存。