[Ruby-on-rails] कई विदेशी_कीज़ के साथ रेल मॉडल है


Answers

केंज़ी के उत्तर में सुधार करने के लिए, आप Person#children ऐसे लोगों द्वारा परिभाषित करके एक सक्रियरेकॉर्ड संबंध प्राप्त कर सकते हैं:

def children
   children_of_mother.merge(children_of_father)
end

अधिक जानकारी के लिए इस उत्तर को देखें

Question

अपेक्षाकृत नया रेल और एक एकल व्यक्ति मॉडल के साथ एक बहुत ही साधारण परिवार "पेड़" मॉडल की कोशिश कर रहा है जिसमें एक नाम, लिंग, पिता_आईडी और माँ_आईडी (2 माता-पिता) हैं। नीचे मूल रूप से मैं क्या करना चाहता हूं, लेकिन जाहिर है मैं दोहरा नहीं सकता हूं: बच्चों के पास है_माइनी में (पहली बार अधिलेखित हो जाता है)

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

2 विदेशी कुंजियों के साथ has_many का उपयोग करने का एक आसान तरीका है, या वस्तु के लिंग के आधार पर विदेशी कुंजी को बदल सकता है? या फिर एक और / बेहतर तरीका है?

धन्यवाद!




सामान्य प्रश्न के हल के रूप में नहीं बताया गया है ("कई विदेशी कुंजियों के साथ है"), लेकिन, एक व्यक्ति को या तो माँ या पिता हो सकता है, लेकिन दोनों नहीं, मैं एक gender कॉलम जोड़ूंगा और साथ में जाना चाहूंगा

  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



रेलों (3.2) में एसोसिएशनों और (एकाधिक) विदेशी कुंजियों के लिए मेरा जवाब : मॉडल में उनका वर्णन कैसे करें, और माइग्रेशन लिखना आपके लिए ही है!

आपके कोड के लिए, यहां मेरे संशोधन हैं I

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

तो कोई प्रश्न?




व्यक्ति के नाम पर नामित_स्कापों का उपयोग करें:

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