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




model has-many (8)

रेल के लिए अपेक्षाकृत नया और एक बहुत ही साधारण परिवार "पेड़" को एक ऐसे व्यक्ति मॉडल के साथ मॉडल करने की कोशिश कर रहा है जिसमें नाम, लिंग, पिता_आईडी और मां_आईडी (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 का उपयोग करने का कोई आसान तरीका है, या शायद ऑब्जेक्ट के लिंग के आधार पर विदेशी कुंजी बदल सकता है? या फिर एक और बेहतर तरीका है?

धन्यवाद!


Answers

मैं एक ही सुविधा की तलाश में था, अगर आप एक सरणी वापस नहीं करना चाहते हैं लेकिन ActiveRecord::AssociationRelation , तो आप << बजाय << उपयोग कर सकते हैं। ( ActiveRecord दस्तावेज़ देखें )

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

मैं इस मुद्दे के लिए स्कोप का उपयोग करना पसंद करता हूं। इस कदर:

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

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

मेरा मानना ​​है कि आप उन रिश्तों को प्राप्त कर सकते हैं जिनका आप उपयोग करना चाहते हैं: 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

मैं काम के बाद इस उत्तर की पुष्टि और संपादन करूंगा; )


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

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

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

def children
   children_of_mother.merge(children_of_father)
end

अधिक जानकारी के लिए यह उत्तर देखें


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

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


रेल पर रूबी के लिए 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end






ruby-on-rails ruby model has-many