2009-08-28 4 views
0

나는 acts-as-tree를 사용하는 모델을 가지고있다. 예를 들어 전체 트리가 구축 될 때까지 아무것도 저장하지, 내 나무를 건물입니다 스크립트/콘솔에서데이터베이스에 커밋하기 전에 ActiveRecord 연결이 유효합니까?

class ActsAsTree 
    belongs_to :parent 
    has_many :children 
end 

: 나무로

class CartoonCharacter < ActiveRecord::Base 
    acts_as_tree 
end 

사도 행전은이 단체가 있습니다. 문제는 데이터베이스에 커밋하기 전에 트리를 성공적으로 탐색 할 수 없다는 것입니다. #parent 및 #sibling을 호출하면 의심스러운 결과가 발생합니다. 나는 내가 뭔가를 놓치고 있다고 가정 할 수있다.

fred=CartoonCharacter.new(:name=>'Fred') 
fred.children.build(:name => 'BamBam') 
pebbles = fred.children.build(:name => 'Pebbles') 

fred.children #=> [BamBam, Pebbles] 
fred.children.last.parent #=> nil --- why not Fred? 
pebbles.siblings #=> [completely unrelated records from db??] 

나는 이것이 연관이 처리되는 방식과 관련이 있다고 생각합니다. 메모리 내 ActiveRecord 구조가 완벽하게 탐색 할 수 있다고 생각했지만, 그렇지는 않습니다. 로깅을 콘솔로 강제하는 것에서부터 때때로 연관을 탐색하는 것이 데이터베이스 액세스를 유발한다는 점을 지적했습니다. 이로 인해 협회를 일주하는 방법을 알기가 어렵습니다. (나는 쿼리 캐싱에 대해 간단히 살펴 보았다.) 다른 사람들이 이것을 어떻게 처리 하는가? 아니면 언제나 레코드와 관계를 저지르고 있습니까? 이것은 수수께끼입니다.


편집 :이 문제를 해결하기 위해 나타납니다 무엇

는 동시에 두 관계를 설정하는 것입니다. 즉, 누락 된 조각은 다음과 같습니다 :

pebbles.parent = fred 
bambam.parent = fred 

이것은 설계 상으로는 무엇입니까? 즉, 우리는 항상 상호 관계의 두 부분을 모두 설정해야합니까?


편집 :

관련 question

답변

0

당신이 acts_as_tree 플러그인을 사용하고 있습니까? - http://github.com/rails/acts_as_tree/tree/master

원하는 방식으로 작동합니다.

자신이 데이터 구조를 롤업하는 경우 OP에 설명 된대로 연결이 완료되지 않았습니다. 서로 다른 외래 키를 참조합니다.

belongs_to :parent # parent_id field in this model 
has_many :children # child_id field in the child models 

현재 인스턴스 쌍 간에는 두 가지 서로 다른 연관이 있습니다. 그래서 두 가지 과제 명세서를 작성해야합니다. 대신 더 나에게 돌아 가야 할 시간을내어

belongs_to :parent, :class_name => "CartoonCharacter", 
    :foreign_key => :tree_key 

has_many :children, :class_name => "CartoonCharacter", 
    :foreign_key => :tree_key 

래리

+0

감사와 같은 위, 뭔가의

. 나는 내가 모든 것을 올바르게 설정했다고 믿지만 그것이 작동하도록 할 수 없었다. 나는 아이들에게 after_add 콜백을 사용하고 거기에 부모를 할당함으로써 이것을 작동 시키려고했다. – Mario

관련 문제