Ruby ActiveRecord:在单次提交中插入父表和子表

Ruby ActiveRecord: Insert to parent and child tables in single commit

我正在使用 Ruby 1.9.3 和 RoR 3.20。

我正在寻找一种方法,在一次提交中插入两个不同的 tables,先是父 tables,然后是子 tables。

目前,ActiveRecord 生成的代码如下:

  (0.0ms)  BEGIN
 SQL (1.0ms)  INSERT INTO `parent` (`datefield`) VALUES ('2015-03-12 13:23:22')
(81.0ms)  COMMIT
(1.0ms)  BEGIN
SQL (1.0ms)  INSERT INTO `child` ( `parent_id`, `textfield`) VALUES ('1', 'text')
(73.0ms)  COMMIT

导致此问题的 ruby 代码是:

fo = Parent.create!(datefield: '2015-03-12 13:23:22')
    fo.child.create(textfield: 'text')

我用创造!因此,如果它失败了,它将退出并且不会尝试为子 table 创建记录,这也会由于外键约束而失败,但我更希望这种交互由数据库事务处理.

我查看了这个线程,它在答案和评论中发布了相关信息,但我希望自从提出该问题以来,过去几年有所改变? link 感谢任何帮助。

只需将您的创建代码行包装在一个事务中。

ActiveRecord::Base.transaction do
  fo = Parent.create!(qprocess: 'SidekiqFailover')
  fo.childs.create(textfield: 'text')
end

由于您的模型继承自 ActiveRecord::Base,您也可以执行以下操作:

Parent.transaction do
  # code
end

此外,如果设置了适当的关联和嵌套属性,您最好这样做:

Parent.transaction do
  fo = Parent.new(qprocess: 'SidekiqFailover')
  fo.childs.new(textfield: 'text')
  fo.save!
end

您应该使用嵌套模型形式而不是创建您自己的父子记录。如果父记录创建失败,它会自动撤消交易。

此外,您无需在代码中编写两个创建操作,它会自动处理。无需添加单独的嵌套模型 gem 它已经存在于 rails 中 3. 如果没有,嵌套模型形式 link link here

这是一个有用的 link