2014-04-10 3 views
2

로 만들어 아이들이 작동하지 않는 속성 :중첩 나는 두 가지 모델이 새로운 부모

class Shift < ActiveRecord::Base 
    attr_accessible :ranges_attributes 
    has_many :ranges 
    accepts_nested_attributes_for :ranges, allow_destroy: true 
end 

class Range < ActiveRecord::Base 
    belongs_to :shift 
    validates :shift, presence: true 
end 
내 컨트롤러에, 나는군요 범위가 변화를 만들려면,

:

Shift.create! params[:shift] 
#ActiveRecord::RecordInvalid Exception: Validation failed: Shift ranges shift can't be blank 

Range 모델에서 validates :shift, presence: true을 제거하면이 기능이 아름답게 작동합니다. 나는 그의 아이들과 새로운 교대를 만들 수있다. ActiveRecord 그게 나를 위해.

질문 : 왜이 유효성 검사를 제거해야합니까?

+0

읽고 추천 내가 확실하지 않다 파괴 따라 어린이 모델 .. –

+1

,하지만 난 생각 '새로운 Shift'와'Range' 객체는 하나의 트랜잭션 동안 생성됩니다. 새로운'Range'를 만들려고 할 때'Shift'가 실제로 존재하지 않을 수도 있습니다. 그러면 유효성 검사 오류가 발생할 수 있습니다. – Bjoernsen

답변

2

부모의 존재를 확인한 것은 타이밍입니다 !! 사실 Shift은 아직 저장되지 않았으므로 중첩 된 ranges을 만들려고하면 데이터베이스에 부모 Shift이 없습니다.

나는이 해결 here

class Shift < ActiveRecord::Base 
    attr_accessible :ranges_attributes 
    has_many :ranges, :inverse_of => :shift 
    accepts_nested_attributes_for :ranges, allow_destroy: true 
end 

을 발견하고 내가 같은 소스에서 (약간의 수정을) 인용 : 때 를 데이터베이스에서 부모를 얻으려고하지 않습니다이 옵션 레일

자녀가 확인됩니다. 부모는 기억에서 나옵니다. 이 옵션을 익숙하지 않으면 난 강력하게 당신이 당신이 그것을 제공해야 공식 rails guide