복붙노트

[RUBY-ON-RAILS] 여러 foreign_keys와 모델 has_many 레일

RUBY-ON-RAILS

여러 foreign_keys와 모델 has_many 레일

상대적으로 레일에 새로운 이름, 성별, father_id 및 mother_id (2 부모)가 한 사람의 모델과 매우 간단한 가족 "나무"를 모델링하려고합니다. 아래는 내가하고 싶은 것을 기본적이지만, 분명히 나는 ​​반복 할 수 없습니다하십시오 has_many 어린이를 (첫 번째는 덮어 얻는다).

class Person < ActiveRecord::Base
  belongs_to :father, :class_name => 'Person'
  belongs_to :mother, :class_name => 'Person'
  has_many :children, :class_name => 'Person', :foreign_key => 'mother_id'
  has_many :children, :class_name => 'Person', :foreign_key => 'father_id'
end

객체의 성별에 따라 외부 키를 두 외국 키 has_many를 사용, 아니면 변경하는 간단한 방법이 있나요? 또는 다른 / 더 좋은 방법은 모두가?

감사!

해결법

  1. ==============================

    1.일에 (레이더 덕분에) 보이는 IRC에 간단한 대답을 찾을 수 :

    일에 (레이더 덕분에) 보이는 IRC에 간단한 대답을 찾을 수 :

    class Person < ActiveRecord::Base
      belongs_to :father, :class_name => 'Person'
      belongs_to :mother, :class_name => 'Person'
      has_many :children_of_father, :class_name => 'Person', :foreign_key => 'father_id'
      has_many :children_of_mother, :class_name => 'Person', :foreign_key => 'mother_id'
      def children
         children_of_mother + children_of_father
      end
    end
    
  2. ==============================

    2.켄지의 대답에 개선하기 위해, 당신은 같은 사람 # 어린이를 정의하여 액티브 관계를 얻을 수 있습니다 :

    켄지의 대답에 개선하기 위해, 당신은 같은 사람 # 어린이를 정의하여 액티브 관계를 얻을 수 있습니다 :

    def children
       children_of_mother.merge(children_of_father)
    end
    

    자세한 내용은이 대답을 참조

  3. ==============================

    3.인격 모델을 통해 중고 named_scopes 이 작업을 수행:

    인격 모델을 통해 중고 named_scopes 이 작업을 수행:

    class Person < ActiveRecord::Base
    
        def children
          Person.with_parent(id)
        end
    
        named_scope :with_parent, lambda{ |pid| 
    
           { :conditions=>["father_id = ? or mother_id=?", pid, pid]}
        }
     end
    
  4. ==============================

    4.난 당신이 사용하여 원하는 관계를 달성 할 수 있다고 생각 : has_one합니다.

    난 당신이 사용하여 원하는 관계를 달성 할 수 있다고 생각 : has_one합니다.

    class Person < ActiveRecord::Base
      has_one :father, :class_name => 'Person', :foreign_key => 'father_id'
      has_one :mother, :class_name => 'Person', :foreign_key => 'mother_id'
      has_many :children, :class_name => 'Person'
    end
    

    나는 확인하고 작업 후이 답변을 편집 할 수 있습니다; )

  5. ==============================

    5.나는이 문제에 대한 범위를 사용하는 것을 선호합니다. 이 같이 :

    나는이 문제에 대한 범위를 사용하는 것을 선호합니다. 이 같이 :

    class Person < ActiveRecord::Base
      belongs_to :father, :class_name => 'Person'
      belongs_to :mother, :class_name => 'Person'
      has_many :children_of_father, :class_name => 'Person', :foreign_key => 'father_id'
      has_many :children_of_mother, :class_name => 'Person', :foreign_key => 'mother_id'
    
      scope :children_for, lambda {|father_id, mother_id| where('father_id = ? AND mother_id = ?', father_id, mother_id) }
    end
    

    이 트릭은 쉽게 사용 인스턴스없이 아이를 얻을 수 있도록 :

    Person.children_for father_id, mother_id
    
  6. ==============================

    6.일반적인 질문에 아니 솔루션 명시된 바와 같이 ( "여러 외래 키와 has_many") 중 하나를 어머니 또는 아버지,하지만 모두가 될 수있는 사람을 부여하지만, 나는 성별 열을 추가하고 함께 갈 것

    일반적인 질문에 아니 솔루션 명시된 바와 같이 ( "여러 외래 키와 has_many") 중 하나를 어머니 또는 아버지,하지만 모두가 될 수있는 사람을 부여하지만, 나는 성별 열을 추가하고 함께 갈 것

      has_many :children_of_father, :class_name => 'Person', :foreign_key => 'father_id'
      has_many :children_of_mother, :class_name => 'Person', :foreign_key => 'mother_id'
      def children
        gender == "male" ? children_of_father : children_of_mother
      end
    
  7. ==============================

    7.당신이 배열하지만 액티브 :: AssociationRelation을 반환하지 않으려는 경우 나, 같은 기능을 찾고 있었어요, 당신은 << 대신 +로 사용할 수 있습니다. 합니다 (액티브 설명서를 참조하십시오)

    당신이 배열하지만 액티브 :: AssociationRelation을 반환하지 않으려는 경우 나, 같은 기능을 찾고 있었어요, 당신은 << 대신 +로 사용할 수 있습니다. 합니다 (액티브 설명서를 참조하십시오)

    class Person < ActiveRecord::Base
      belongs_to :father, :class_name => 'Person'
      belongs_to :mother, :class_name => 'Person'
    
      has_many :children_of_father, :class_name => 'Person', :foreign_key => 'father_id'
      has_many :children_of_mother, :class_name => 'Person', :foreign_key => 'mother_id'
    
      def children
         children_of_mother << children_of_father
      end
    end
    
  8. ==============================

    8.내 협회에 대한 답변과 레일 (복수) 외래 키 (3.2) : 모델에서 그들을 설명하고 마이그레이션을 작성하는 방법을 당신을 위해 단지입니다!

    내 협회에 대한 답변과 레일 (복수) 외래 키 (3.2) : 모델에서 그들을 설명하고 마이그레이션을 작성하는 방법을 당신을 위해 단지입니다!

    코드에 관해서는, 여기 내 수정은

    class Person < ActiveRecord::Base
      belongs_to :father, :class_name => 'Person'
      belongs_to :mother, :class_name => 'Person'
      has_many :children, ->(person) { unscope(where: :person_id).where("father_id = ? OR mother_id = ?", person.id, person.id) }, class_name: 'Person'
    end
    

    질문 그래서?

  9. from https://stackoverflow.com/questions/307581/rails-model-has-many-with-multiple-foreign-keys by cc-by-sa and MIT license