使用具有单一 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_key
和 class_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 错误。 :(
我第一次使用 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_key
和 class_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 错误。 :(