Rails ActiveRecord: откат сохранения вложенных моделей

Используя Rails 5:

gem 'rails', '~> 5.0.0', '>= 5.0.0.1'

Я создал самый простой пример, который я могу придумать, чтобы продемонстрировать проблему:

parent.rb

class Parent < ApplicationRecord
  has_many :children
  accepts_nested_attributes_for :children
end

child.rb

class Child < ApplicationRecord
  belongs_to :parent
end

Создать родителя, сохранить, создать ребенка, сохранить (работает)

С помощьюrails consoleСоздание нового родителя, затем сохранение, затем создание потомка из родительского, затем сохранение родителя, работает нормально:

irb(main):004:0> parent = Parent.new
=> #<Parent id: nil, created_at: nil, updated_at: nil>
irb(main):005:0> parent.save
   (0.5ms)  BEGIN
  SQL (0.4ms)  INSERT INTO `parents` (`created_at`, `updated_at`) VALUES ('2016-09-25 13:05:44', '2016-09-25 13:05:44')
   (3.2ms)  COMMIT
=> true
irb(main):006:0> parent.children.build
=> #<Child id: nil, parent_id: 1, created_at: nil, updated_at: nil>
irb(main):007:0> parent.save
   (0.5ms)  BEGIN
  Parent Load (0.5ms)  SELECT  `parents`.* FROM `parents` WHERE `parents`.`id` = 1 LIMIT 1
  SQL (0.7ms)  INSERT INTO `children` (`parent_id`, `created_at`, `updated_at`) VALUES (1, '2016-09-25 13:05:52', '2016-09-25 13:05:52')
   (1.3ms)  COMMIT
=> true

Создать родителя, создать ребенка, сохранить (не работает)

Тем не менее, если я пытаюсь создать нового родителя, то построить ребенкабез сохранение родителя и, наконец, сохранение родителя в конце, транзакция завершается неудачно и откатывается:

irb(main):008:0> parent = Parent.new
=> #<Parent id: nil, created_at: nil, updated_at: nil>
irb(main):009:0> parent.children.build
=> #<Child id: nil, parent_id: nil, created_at: nil, updated_at: nil>
irb(main):010:0> parent.save
   (0.5ms)  BEGIN
   (0.4ms)  ROLLBACK
=> false

Может кто-нибудь объяснить, почему и как исправить?

ОБНОВИТЬ

Создание родительского и дочернего, а затем сохранение работает, если вы передадитеvalidate: falseТаким образом, это указывает на проблему, связанную с ошибкой проверки дочернего элемента, поскольку для этого необходимо установить parent_id, но, по-видимому, должна выполняться дочерняя проверка.до тогда родитель сохранен, иначе он не выйдет из строя?

irb(main):001:0> parent = Parent.new
=> #<Parent id: nil, created_at: nil, updated_at: nil>
irb(main):002:0> parent.children.build
=> #<Child id: nil, parent_id: nil, created_at: nil, updated_at: nil>
irb(main):003:0> parent.save(validate: false)
   (0.7ms)  BEGIN
  SQL (0.9ms)  INSERT INTO `parents` (`created_at`, `updated_at`) VALUES ('2016-09-25 15:02:20', '2016-09-25 15:02:20')
  SQL (0.8ms)  INSERT INTO `children` (`parent_id`, `created_at`, `updated_at`) VALUES (3, '2016-09-25 15:02:20', '2016-09-25 15:02:20')
   (1.6ms)  COMMIT
=> true

ОБНОВЛЕНИЕ 2

Это также работает с использованиемsave (безvalidation: false) если я удалюbelongs_to :parent линия отchild.rbс тех пор не проводится проверка того, чтоparent_id действителен до того, как будет сохранен - ​​однако, тогда вы потеряете способность достать родителя от ребенка (черезchild.parent). Вы все еще можете добраться до ребенка от родителя (черезparent.child).

Ответы на вопрос(2)

Ваш ответ на вопрос