처음 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
내가 foreign_key
및 class_name
을 설정하려고했습니다 belongs_to
관계에, 행운과 :
class PackageItem < DocumentItem
belongs_to :package, foreign_key: 'document_id', class_name: 'Document'
end
내가 뭘 잘못하고 있니?
는업데이트 :
이 레일 (5) 및 협회 기본적으로 required: true
데에 문제가 될 것으로 보인다. Invoice
모델에서 required: true
을 끄고 foreign_key
을 설정하면 올바르게 모델 ID를 할당하고 상위 모델 및 하위 모델을 저장합니다.
생각 : 아마도 협회는 상위 클래스에 선언되어야 대신 IE는 PackageItem 패키지에 속해 있지 않고, DocumentItem는 문서에 속하는 일하는 것이 – henrebotha
@henrebotha 확신 그것은 것.. STI 생각을 사용하는 지점을 놓치지 마라. : / –