使用具有单一 Table 继承的 accepts_nested_attributes_for 时验证失败

Validation Failed when using accepts_nested_attributes_for with Single Table Inheritance

我第一次使用 STI,在尝试将 accepts_nested_attributes_for 用于嵌套继承对象时遇到了问题。运行。

class Document < ApplicationRecord
  # code removed for brevity
end

class DocumentItem < ApplicationRecord
   # code removed for brevity
end

class Package < Document
    belongs_to :user
    validates :title, :user, presence: true

    has_many :package_items, dependent: :destroy
    accepts_nested_attributes_for :package_items, reject_if: :all_blank, allow_destroy: true
end

class PackageItem < DocumentItem
    belongs_to :package
end

当我尝试使用嵌套属性时,一切都停止了:

Package.create!(title: 'test', 
                user: User.last, 
                package_items_attributes: [{title: 'test'}])

这会导致以下错误:

ActiveRecord::RecordInvalid: Validation failed: Package items package must exist

我尝试在 belongs_to 关系上设置 foreign_keyclass_name,但没有成功:

class PackageItem < DocumentItem
    belongs_to :package, foreign_key: 'document_id', class_name: 'Document'
end

我做错了什么?

更新:

这似乎是 Rails 5 和默认具有 required: true 的关联的问题。在 Invoice 模型上关闭 required: true 并设置 foreign_key 时,它会正确分配父模型 ID 并保存父模型和子模型。

事实证明它与 STI 无关,是一个已知的 Rails 5 错误。 :(

https://github.com/rails/rails/issues/25198