35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/schemard/relation_generator.rb', line 35
def run
hash = ObjectSpace.each_object(Class)
.select{|o| o.ancestors.include?(ActiveRecord::Base) && o != ActiveRecord::Base }
.select{|o| o.table_name }
.each_with_object({}) do |model, hash|
hash[model.table_name] = {}
relation_selector = ->(type){
if defined?(ActiveRecord::Reflection::HasOneReflection)
klasses = {
has_one: ActiveRecord::Reflection::HasOneReflection,
has_many: ActiveRecord::Reflection::HasManyReflection,
belongs_to: ActiveRecord::Reflection::BelongsToReflection
}
model._reflections.values.select{|r| r.is_a?(klasses[type]) }
else
klasses = {
has_one: ActiveRecord::Associations::HasOneAssociation,
has_many: ActiveRecord::Associations::HasManyAssociation,
belongs_to: ActiveRecord::Associations::BelongsToAssociation
}
model.reflections.values
.select{|r| r.is_a?(ActiveRecord::Reflection::AssociationReflection) }
.select{|r| r.association_class == klasses[type] }
end
}
has_one_rels = relation_selector.call(:has_one)
has_many_rels = relation_selector.call(:has_many)
belongs_to_rels = relation_selector.call(:belongs_to)
relations_to_table_names = ->(relations){
relations.map{|r| begin r.klass.table_name; rescue => e; nil; end }.compact
}
if has_one_rels.present?
hash[model.table_name]["has_one"] = relations_to_table_names.call(has_one_rels)
end
if has_many_rels.present?
hash[model.table_name]["has_many"] = relations_to_table_names.call(has_many_rels)
end
if belongs_to_rels.present?
hash[model.table_name]["belongs_to"] = relations_to_table_names.call(belongs_to_rels)
end
end
puts YAML.dump({ "tables" => hash.reject{|key,val| val.empty? } })
end
|