@@ -20,65 +20,94 @@ def load
2020
2121 private
2222
23- INTERNAL_TABLES = %w[ar_internal_metadata schema_migrations].freeze
24-
2523 def build_schema
2624 schema = Schema.new
27- table_names = @connection.tables - INTERNAL_TABLES
25+ table_names = user_table_names
2826
2927 join_table_names = detect_join_tables(table_names)
3028
3129 (table_names - join_table_names).each do |name|
32- columns = @connection.columns(name)
33- .reject { |c| skip_column?(c.name) }
34- .map { |c| c.name.to_sym }
35-
36- foreign_keys = @connection.foreign_keys(name)
37- associations = foreign_keys.map do |fk|
38- assoc_name = fk.column.sub(/_id$/, "")
39- Schema::BelongsTo.new(
40- name: assoc_name.to_sym,
41- table: fk.to_table.to_sym,
42- foreign_key: fk.column.to_sym
43- )
44- end
45-
46- schema.add_table(Schema::Table.new(
47- name: name.to_sym,
48- singular_name: ActiveSupport::Inflector.singularize(name).to_sym,
49- columns: columns,
50- belongs_to_associations: associations
51- ))
30+ schema.add_table(build_table(name))
5231 end
5332
5433 join_table_names.each do |name|
55- fk_columns = @connection.columns(name)
56- .select { |c| c.name.end_with?("_id") }
57- .map { |c| c.name }
58-
59- schema.add_join_table(Schema::JoinTable.new(
60- name: name.to_sym,
61- left_table: ActiveSupport::Inflector.pluralize(fk_columns[0].sub(/_id$/, "")).to_sym,
62- right_table: ActiveSupport::Inflector.pluralize(fk_columns[1].sub(/_id$/, "")).to_sym,
63- left_foreign_key: fk_columns[0].to_sym,
64- right_foreign_key: fk_columns[1].to_sym
65- ))
34+ schema.add_join_table(build_join_table(name))
6635 end
6736
6837 schema
6938 end
7039
71- def skip_column?(name)
40+ def build_table(name)
41+ columns = @connection.columns(name)
42+ .reject { |c| framework_column?(c.name) }
43+ .map { |c| c.name.to_sym }
44+
45+ associations = @connection.foreign_keys(name).map do |fk|
46+ Schema::BelongsTo.new(
47+ name: association_name(fk.column),
48+ table: fk.to_table.to_sym,
49+ foreign_key: fk.column.to_sym
50+ )
51+ end
52+
53+ Schema::Table.new(
54+ name: name.to_sym,
55+ singular_name: singularize(name),
56+ columns: columns,
57+ belongs_to_associations: associations
58+ )
59+ end
60+
61+ def build_join_table(name)
62+ fk_columns = foreign_key_columns(name)
63+
64+ Schema::JoinTable.new(
65+ name: name.to_sym,
66+ left_table: table_name_for_foreign_key(fk_columns[0]),
67+ right_table: table_name_for_foreign_key(fk_columns[1]),
68+ left_foreign_key: fk_columns[0].to_sym,
69+ right_foreign_key: fk_columns[1].to_sym
70+ )
71+ end
72+
73+ def user_table_names
74+ @connection.tables - %w[ar_internal_metadata schema_migrations]
75+ end
76+
77+ def framework_column?(name)
7278 %w[id created_at updated_at].include?(name)
7379 end
7480
81+ def foreign_key_column?(column)
82+ column.name.end_with?("_id")
83+ end
84+
85+ def foreign_key_columns(table_name)
86+ @connection.columns(table_name)
87+ .select { |c| foreign_key_column?(c) }
88+ .map { |c| c.name }
89+ end
90+
91+ def association_name(column_name)
92+ column_name.sub(/_id$/, "").to_sym
93+ end
94+
95+ def table_name_for_foreign_key(column_name)
96+ pluralize(column_name.sub(/_id$/, ""))
97+ end
98+
99+ def singularize(word)
100+ ActiveSupport::Inflector.singularize(word).to_sym
101+ end
102+
103+ def pluralize(word)
104+ ActiveSupport::Inflector.pluralize(word).to_sym
105+ end
106+
75107 def detect_join_tables(table_names)
76108 table_names.select do |name|
77- pk = @connection.primary_key(name)
78- next false if pk
79-
80- id_cols = @connection.columns(name).select { |c| c.name.end_with?("_id") }
81- id_cols.size == 2
109+ next false if @connection.primary_key(name)
110+ foreign_key_columns(name).size == 2
82111 end
83112 end
84113 end
0 commit comments