Skip to content

Commit 465dc4a

Browse files
committed
Extract named methods for string operations in SchemaLoader
Replace inline string manipulations with intention-revealing methods: association_name, foreign_key_column?, framework_column?, table_name_for_foreign_key, user_table_names. Also extract build_table and build_join_table from build_schema.
1 parent 2eab9b4 commit 465dc4a

File tree

1 file changed

+69
-40
lines changed

1 file changed

+69
-40
lines changed

lib/fixture_bot/rails/schema_loader.rb

Lines changed: 69 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)