1
第一次我使用STI,並且在嘗試將accepts_nested_attributes_for
與嵌套的繼承對象一起使用時遇到問題。驗證使用accept_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
我試過設置foreign_key
和class_name
關於belongs_to
的關係,沒有運氣:
class PackageItem < DocumentItem
belongs_to :package, foreign_key: 'document_id', class_name: 'Document'
end
我在做什麼錯在這裏?
UPDATE:
這似乎與導軌5和協會有required: true
默認的問題。當在Invoice
模型上關閉required: true
並設置foreign_key
時,它會正確分配父模型ID並保存父模型和子模型。
一個念頭:也許是協會應在父類中聲明,而不是即不PackageItem屬於包,而是DocumentItem屬於文檔 – henrebotha
@henrebotha相當肯定,將工作會。錯過了使用STI想法的地方:/ –