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



Answers

के जवाब में सुधार करने के लिए, आप Person#children को परिभाषित करके एक ActiveRecord संबंध प्राप्त कर सकते हैं जैसे:

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 का उपयोग करने का कोई आसान तरीका है, या शायद ऑब्जेक्ट के लिंग के आधार पर विदेशी कुंजी बदल सकता है? या फिर एक और बेहतर तरीका है?

धन्यवाद!




एसोसिएशन और (एकाधिक) रेलों में विदेशी कुंजी का जवाब (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

तो कोई सवाल है?




व्यक्ति मॉडल पर इस्तेमाल किए गए नाम_स्कोप यह करते हैं:

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



जैसा कि बताया गया है ("कई विदेशी कुंजी के साथ है_मनी" के सामान्य प्रश्न का समाधान नहीं है, लेकिन, एक व्यक्ति को या तो माता या पिता हो सकता है, लेकिन दोनों नहीं, मैं एक 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



Links