@@ -4,40 +4,44 @@ module FixtureBot
44 class RowDSL
55 attr_reader :literal_values , :association_refs , :tag_refs
66
7- def self . for ( table_def , schema )
8- klass = Class . new ( self )
9-
10- table_def . columns . each do |col |
11- klass . define_method ( col ) do |value |
12- @literal_values [ col ] = value
13- end
14- end
7+ def initialize ( table_def , schema )
8+ @table_def = table_def
9+ @schema = schema
10+ @literal_values = { }
11+ @association_refs = { }
12+ @tag_refs = { }
13+ end
1514
16- table_def . belongs_to_associations . each do |assoc |
17- klass . define_method ( assoc . name ) do |ref |
18- @association_refs [ assoc . name ] = ref
19- end
20- end
15+ private
2116
22- schema . join_tables . each_value do |jt |
23- if jt . left_table == table_def . name
24- klass . define_method ( jt . right_table ) do |*refs |
25- @tag_refs [ jt . name ] = { table : jt . right_table , refs : refs }
26- end
27- elsif jt . right_table == table_def . name
28- klass . define_method ( jt . left_table ) do |*refs |
29- @tag_refs [ jt . name ] = { table : jt . left_table , refs : refs }
30- end
31- end
17+ def method_missing ( method_name , *args , &block )
18+ if @table_def . columns . include? ( method_name )
19+ @literal_values [ method_name ] = args . first
20+ elsif ( assoc = @table_def . belongs_to_associations . find { |a | a . name == method_name } )
21+ @association_refs [ assoc . name ] = args . first
22+ elsif ( jt = find_join_table ( method_name ) )
23+ @tag_refs [ jt [ :join_table ] . name ] = { table : jt [ :other_table ] , refs : args }
24+ else
25+ super
3226 end
27+ end
3328
34- klass . new
29+ def respond_to_missing? ( method_name , include_private = false )
30+ @table_def . columns . include? ( method_name ) ||
31+ @table_def . belongs_to_associations . any? { |a | a . name == method_name } ||
32+ !!find_join_table ( method_name ) ||
33+ super
3534 end
3635
37- def initialize
38- @literal_values = { }
39- @association_refs = { }
40- @tag_refs = { }
36+ def find_join_table ( method_name )
37+ @schema . join_tables . each_value do |jt |
38+ if jt . left_table == @table_def . name && jt . right_table == method_name
39+ return { join_table : jt , other_table : jt . right_table }
40+ elsif jt . right_table == @table_def . name && jt . left_table == method_name
41+ return { join_table : jt , other_table : jt . left_table }
42+ end
43+ end
44+ nil
4145 end
4246 end
4347end
0 commit comments