我正在寻找一种方法来列出模型的所有关联。这是为了对大型旧数据库运行一些一致性后台验证。模型太多,无法手动发现并且容易出错。
我知道
Model.new.attributes
方法。但我看不出哪个属性是关联,是哪个模型,是否是多态。
也许我可以假设
something_id
是一个关联,并查找 something_type
属性来了解它是否是多态的。但这样我就无法捕捉到一对多的关联,对于多对多的关联就更难了。
有更可靠的方法吗?
在类上使用 reflect_on_all_associations。这将为每个关联返回一个 ActiveRecord::Reflection::AssociationReflection 子类数组(不幸的是未记录)。例如,belongs_to 关联将返回 ActiveRecord::Reflection::BelongsToReflection。
#klass
将返回关联的类,#name
将返回关联名称,从#association_class
您可以找出关联的类型。
例如。
class Parent < ApplicationRecord
end
class Child < ApplicationRecord
belongs_to :parent
end
# Parent
p Child.reflect_on_all_associations.map(&:klass)