2009-12-27 3 views
1

내가 찾는 내가 관련 컬렉션에 새 항목을 추가 할 경우, 나는 결과의 변화를 볼 수 foo.reload를 호출 할 필요가 없습니다 (스크립트/콘솔에서 주변에 noodling) 오전 :중첩 된 특성 컬렉션을 업데이트 한 후 ActiveRecord :: Base.reload를 호출해야합니까?

foo.bars 
=> [] 
foo.bars_attributes = [{ :person_id => '288', :task_id => '1237' }] 
=> [{ :person_id=>"288", :task_id=>"1237" }] 
foo.save 
=> true 
foo.bars 
=> [#<Bar id: 6, person_id: 288, task_id => 1237>] 

좋아요를. 내가 컬렉션에서 항목을 제거 할 때, 나는 내 컬렉션에 반영됩니다 (저장 호출 후에 DB에 표시) 변경 전의 foo.reload를 호출해야합니까 :

foo.bars_attributes = [{ :id => '6', :_delete => '1' }] 
= [{ :_delete=>"1", :id=>"6" }] 
foo.save 
=> true 
foo.bars 
=> [#<Bar id: 6, person_id: 288, task_id => 1237>] 
foo.reload 
foo.bars 
=> [] 

하면이 정상인가요, 아니면 오전 협회 업데이트에서 약간 잘못된 것을하고 있습니까?

답변

0

레일즈 3.0에서 같은 것을 보았습니다 (아직 쓰지 않았을 때). 최소한의 연관성을 요구하는 검증을 통해 혼란을 겪고있었습니다. 부모 인스턴스는 업데이트가 모든 자식 특성을 제거한 후에도 유효하다고 말합니다.

나는 다음과 같은 방법으로 내 Parent 모델의 모듈을 포함하고, 컨트롤러의 update 방법 update_attributes()에 대한 것을 대체하여 해결 방법을 고안이 더가 없습니다

def update_with_association_size_validations(attributes) 
    update_successful = false 
    self.class.transaction do 
     self.update_attributes(attributes) 
     self.reload 
     update_successful = true if self.valid? 
     raise ActiveRecord::Rollback unless update_successful 
    end 
    update_successful 
    end 

완벽한 솔루션을 의미하며, 그것은이다 더 깊게 중첩 된 연결에 대해서는 테스트되지 않았습니다.

절대로, 거의 1 년 동안 결코 좋지 않습니다!

관련 문제