26
27
28
29
30
31
32
33
34
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
|
# File 'lib/schemard/relation_generator.rb', line 26
def run
Dir.glob(Rails.root + "app/models/**/*")
.reject{|path| Dir.exist?(path) }.each{|filepath| require filepath }
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)
if has_one_rels.present?
hash[model.table_name]["has_one"] = has_one_rels.map{|r| r.klass.table_name }
end
if has_many_rels.present?
hash[model.table_name]["has_many"] = has_many_rels.map{|r| r.klass.table_name }
end
if belongs_to_rels.present?
hash[model.table_name]["belongs_to"] = belongs_to_rels.map{|r| r.klass.table_name }
end
end
puts YAML.dump({ "tables" => hash })
end
|