2016-05-17 5 views
0

Ich arbeite an einem Edelstein, um einen kleinen Teil der zugehörigen ActiveRecord Objekte zu exportieren.Gibt es eine bessere Möglichkeit, Kinder und Eltern eines ActiveRecord-Objekts zu finden?

Hier ist, wie ich derzeit finde Eltern & Kinder.

# belongs_to, based on column names with an _id suffix 
def belongs_to_relations(ar_instance) 
    columns = ar_instance.class.column_names 
    parents = columns.map{ |c| c if c =~ /_id/ }.reject{ |c| c.nil? } 
    parents.map!{ |parents| parents.gsub('_id', '') } 
end 

# has_many, based on existence of a xxx_id column in other tables 
def has_many_relations(ar_instance) 
    column_name = "#{ar_instance.class.name.underscore}_id" 
    descendents = ActiveRecord::Base.connection.tables 
    descendents.reject!{ |table| false unless table.classify.constantize rescue true } 
    descendents.reject!{ |table| true unless table.classify.constantize.column_names.include?(column_name) } 
end 

Gibt es eine bessere Möglichkeit, diese Beziehungen zu finden? Das funktioniert ok, aber entfernte Beziehungen, wie: durch, muss ich manuell angeben.

Antwort

1

Verwendung class.reflections. Es gibt Informationen über die Beziehungen eines Modells zurück.

Stellen Sie sich diese einfache eingerichtet haben:

{ 
    :user_type => <Reflection @macro=:belongs_to, etc. ...>, 
    :user_logs => <Reflection @macro=:has_many, etc. ...> 
} 

Die Reflexion ist eine Instanz von ActiveRecord::Reflection::AssociationReflection oder ActiveRecord::Reflection::ThroughReflection:

# user.rb 
belongs_to :user_type 
has_many :user_logs 

Wenn Sie rufen User.reflections Sie einen Hash ähnlich der folgenden erhalten. Es enthält Informationen darüber, auf welches Modell es verweist, welche Optionen es gibt (wie dependent => :destroy), welche Art von Assoziation es ist (@macro in meinem Beispiel), usw.

0

Ich bin nicht genau sicher, ob das ist, was Sie suchen, aber ActiveRecord hat Helfer, dies zu tun. In Ihren Modellen:

#school.rb 
has_many :classrooms 

#classroom.rb 
belongs_to :school 

Sie können jetzt so ziemlich überall verwenden:

school = random_classroom.school 
classrooms = school.classrooms 

Für eine has_many :through Beziehung:

# school.rb 
    has_many :students, 
      :through => :classrooms 
Verwandte Themen