有没有更好的方法来查找ActiveRecord对象的子级和父级?

时间:2016-05-17 16:06:35

标签: ruby-on-rails activerecord

我正在使用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 ,但远程关系,如:通过,我必须手动指定。

2 个答案:

答案 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::AssociationReflectionActiveRecord::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