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。
我正在使用 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。