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_keyclass_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並保存父模型和子模型。

+0

一個念頭:也許是協會應在父類中聲明,而不是即不PackageItem屬於包,而是DocumentItem屬於文檔 – henrebotha

+0

@henrebotha相當肯定,將工作會。錯過了使用STI想法的地方:/ –

回答