我正在使用gem来导出一小部分相关的ActiveRecord对象。
以下是我目前正在寻找父母的方式。孩子。
# 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
有没有更好的方法来找到这些关系?这工作 ok ,但远程关系,如:通过,我必须手动指定。
答案 0 :(得分:1)
使用class.reflections
。它返回有关模型关系的信息。
想象一下,你有这么简单的设置:
# user.rb
belongs_to :user_type
has_many :user_logs
如果您致电User.reflections
,您将获得类似于以下内容的哈希:
{
:user_type => <Reflection @macro=:belongs_to, etc. ...>,
:user_logs => <Reflection @macro=:has_many, etc. ...>
}
反射是ActiveRecord::Reflection::AssociationReflection
或ActiveRecord::Reflection::ThroughReflection
的实例。它包含有关它引用的模型,选项的内容(如dependent => :destroy
),它是什么类型的关联(在我的示例中为@macro
)等信息。
答案 1 :(得分:0)
我不确定这是否是您正在寻找的内容,但ActiveRecord有助手来执行此操作。 在你的模特中:
#school.rb
has_many :classrooms
#classroom.rb
belongs_to :school
您现在可以在任何地方使用:
school = random_classroom.school
classrooms = school.classrooms
对于has_many :through
关系:
# school.rb
has_many :students,
:through => :classrooms