[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.일에 (레이더 덕분에) 보이는 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.켄지의 대답에 개선하기 위해, 당신은 같은 사람 # 어린이를 정의하여 액티브 관계를 얻을 수 있습니다 :
켄지의 대답에 개선하기 위해, 당신은 같은 사람 # 어린이를 정의하여 액티브 관계를 얻을 수 있습니다 :
def children children_of_mother.merge(children_of_father) end
자세한 내용은이 대답을 참조
-
==============================
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.난 당신이 사용하여 원하는 관계를 달성 할 수 있다고 생각 : 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.나는이 문제에 대한 범위를 사용하는 것을 선호합니다. 이 같이 :
나는이 문제에 대한 범위를 사용하는 것을 선호합니다. 이 같이 :
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.일반적인 질문에 아니 솔루션 명시된 바와 같이 ( "여러 외래 키와 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.당신이 배열하지만 액티브 :: 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.내 협회에 대한 답변과 레일 (복수) 외래 키 (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
질문 그래서?
from https://stackoverflow.com/questions/307581/rails-model-has-many-with-multiple-foreign-keys by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 고안 비밀 키가 설정되지 않았습니다 (0) | 2020.02.14 |
---|---|
[RUBY-ON-RAILS] 정의되지 않은 메서드 '구성': 오류 발사는 서버를 레일 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 4 레일 : 모델의 네임없이 하위 경로에 레일 모델을 구성? (0) | 2020.02.13 |
[RUBY-ON-RAILS] 액티브에서 만든에서 ID를 재정의 (0) | 2020.02.13 |
[RUBY-ON-RAILS] 레일에 어떻게 CSV 파일로 레코드를 반환합니다 (0) | 2020.02.13 |