mysql - ruby ActiveRecord : Insert to parent and child tables in single commit

标签 mysql ruby-on-rails ruby ruby-on-rails-3 activerecord

我使用的是 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/

相关文章:

java - 创建具有多个主键的联接表?

ruby-on-rails - FactoryGirl/Bot 图像定义

php - MySQL Datediff 跳过周六和周日

php - 错误 : You have an error in your SQL syntax near '' at line 1

ruby-on-rails - 迁移期间无法连接到服务器

ruby-on-rails - 弃用警告中的 Ruby 版本错误

ruby-on-rails - 用于在 Ubuntu 上进行开发的 Ruby On Rails IDE

ruby-on-rails - 在 Rails Action 中使用 Thread.new

ruby-on-rails - Array#Uniq 在 Ruby1.8.7 中的等价物

MySQL 查询帮助 - 'count' 作为变量未按预期工作