我使用的是 Ruby 1.9.3 和 RoR 3.20。
我正在寻找一种方法,可以在一次提交中插入两个不同的表(父表和子表)。
目前,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')
我使用创建!这样,如果它失败,它将退出并且不会尝试为子表创建记录,子表也会因为外键约束而失败,但我更希望这种交互由数据库事务处理。
我查看了这个帖子,其中在答案和评论中发布了相关信息,但我希望自从提出这个问题以来,过去几年里发生了一些变化? 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
关于mysql - ruby ActiveRecord : Insert to parent and child tables in single commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29008698/