2009-02-06 4 views
3

두 모델이 있습니다 : 사람과 관계. 두 번째 사람은 두 사람 사이의 관계에 대한 정보를 저장합니다. 그것은 parent_id와 child_id 필드를 가지고 있고 id 필드를 가지고 있지 않습니다. 나는 has_many : through와 연결하여 작동한다.레일스에서 ​​id가없는 테이블을 관리하는 방법은 무엇입니까?

그러나 :

  1. Relation.find (모든)은 (더 ID 필드가없는 렸기 때문에) 테이블에 어떤 관계가있는 경우에도 빈 배열을 반환합니다.
  2. 관계를 삭제하는 방법을 모르겠다.

    class Person < ActiveRecord::Base 
        has_many :child_relations, 
          :class_name => "Relation", 
          :foreign_key => "parent_id" 
        has_many :parent_relations, 
          :class_name => "Relation", 
          :foreign_key => "child_id" 
    
        has_many :children, :through => :child_relations 
        has_many :parents, :through => :parent_relations 
    end 
    
    class Relation < ActiveRecord::Base 
        belongs_to :parent, :class_name => "Person" 
        belongs_to :child, :class_name => "Person" 
    end 
    

    어떤 제안 :

내 모델은 다음과 같습니다?

업데이트 : has_many :까지 사용했습니다. 테이블에 관계 유형에 대한 정보도 저장했기 때문에. 현재 포기하고 ID 테이블을 테이블에 추가했습니다 (Rails 규칙 ...). 하지만 제 질문은 열려 있습니다.

답변

7

has_many : through는 조인 테이블의 ID에 따라 다릅니다. 조인 테이블을 전체 모델로 만듭니다. 레코드가있는 모든 작업은 ID로 발생하기 때문에 테이블없이 직접 인터페이스 할 수는 없습니다. 레코드를 삭제하면 rails는 sql을 생성하여 레코드를 해당 id로 삭제합니다. 전체 모델로 작동하는 조인 테이블이있는 경우 ID가

이거나 예상 한 것보다 더 많이 작동하는 has_and_belongs_to_many을 사용할 수 있습니다. 관계 모델을 사용하지 않고 연관을 통해 오브젝트를 제거하는 관계를 제거하십시오.

가장 좋은 방법은 조인 테이블에 ID를 추가하는 것입니다. 그런 식으로 미래에 관계 모델이 더 복잡 해지면이를 자체 엔티티로 추적 할 수 있습니다.

0

올바른 방향으로 나아가 야합니다. 나는 그것을 테스트하기위한 레일 프롬프트가 아니지만, 모델을 설정하고 시도하는 것이 꽤 빠를 것입니다. 희망이 도움이됩니다!

class Relation < ActiveRecord::Base 
    belongs_to :parent, :class_name => "Person", :foreign_key => :parent_id 
    belongs_to :child, :class_name => "Person", :foreign_key => :child_id 
end 

class Person < ActiveRecord::Base 
    has_many :relations 
    has_many :children, :through => :relations 
    has_many :parents, :through => :relations 
end 
+0

그것은 작동하지 않습니다 단지 두 has_and_belongs_to_many 참조를하지 않아도됩니다. 관계가 아닌 개인 모델에서 외래 키를 설정해야합니다. Relation 모델에서는 연관 이름 (부모 및 자식)에 _id를 추가하기 때문에 Rails는 외래 키의 이름을 추측합니다. 그래서 아마도 모델 사양은 제가 제 질문에서 제안한대로 유지해야합니다. 하지만 어쨌든 고마워! – klew

관련 문제