brick 1.0.21 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ad289d9f4db9ef6ce9edcfb8948926d4a61910294291272ccf2b342fa2f5051
4
- data.tar.gz: 9030f9ccf39d7f0a9a0ff9413e4f24ee7a46beaf3aba056e9875fc5c29551419
3
+ metadata.gz: 82ebef3561b9cd7b8abcbbd8a30b7687485543ddf1a0900a9935dfb99299f13f
4
+ data.tar.gz: ba071d53409fd8d4833693907364c745585aeb0bb18e885fcf7cbf1bd23b9940
5
5
  SHA512:
6
- metadata.gz: ed6f08eabba91cb304141a0c84884cfbeaae0087094b1fe1ff4a80195aee44dbb697c385ab9d7afaac2e337f9008bc7bef059be98f95264fec34a2288beaff6b
7
- data.tar.gz: 5ebbb793d23634232a529b3d39224e1e4deaa010cf8bf2841effe20a9e3b4d7079fb7163e6c2f90feeed8526c4a1314f319bad47d1c8a6079bf54ca92f0e6224
6
+ metadata.gz: 69ad3ae158a8e478864db65dc808152d4b1b16bdc8779b1a651f59f199167daf00d2aa10018c5f65d5e619bbca4c09e99bc319ca736eed57023d61e6067ea365
7
+ data.tar.gz: 18ca63e176e12ea50a5168e835a2eddfa66c8f522943d42e6d895d2f3e05d0cf6d396ab28d79f98898c91670b618cc27dbad5fa0bc9129a3edcfc3f74f5db029
@@ -166,8 +166,8 @@ module ActiveRecord
166
166
  if is_brackets_have_content
167
167
  output
168
168
  elsif pk_alias
169
- if (id = obj.send(pk_alias))
170
- "#{klass.name} ##{id}"
169
+ if (id = pk_alias.map { |pk_alias_part| obj.send(pk_alias_part) })
170
+ "#{klass.name} ##{id.join(', ')}"
171
171
  end
172
172
  # elsif klass.primary_key
173
173
  # "#{klass.name} ##{obj.send(klass.primary_key)}"
@@ -176,6 +176,14 @@ module ActiveRecord
176
176
  end
177
177
  end
178
178
 
179
+ def self.bt_link(assoc_name)
180
+ model_underscore = name.underscore
181
+ assoc_name = CGI.escapeHTML(assoc_name.to_s)
182
+ model_path = Rails.application.routes.url_helpers.send("#{model_underscore.pluralize}_path".to_sym)
183
+ link = Class.new.extend(ActionView::Helpers::UrlHelper).link_to(name, model_path)
184
+ model_underscore == assoc_name ? link : "#{assoc_name}-#{link}".html_safe
185
+ end
186
+
179
187
  private
180
188
 
181
189
  def self._brick_get_fks
@@ -267,27 +275,6 @@ module ActiveRecord
267
275
  # , is_add_bts, is_add_hms
268
276
  )
269
277
  is_add_bts = is_add_hms = true
270
- wheres = {}
271
- has_hm = false
272
- params.each do |k, v|
273
- case (ks = k.split('.')).length
274
- when 1
275
- next unless klass._brick_get_fks.include?(k)
276
- when 2
277
- assoc_name = ks.first.to_sym
278
- # Make sure it's a good association name and that the model has that column name
279
- next unless (assoc = klass.reflect_on_association(assoc_name))&.klass&.columns&.map(&:name)&.include?(ks.last)
280
-
281
- # So that we can map an association name to any special alias name used in an AREL query
282
- ans = (assoc.klass._assoc_names[assoc_name] ||= [])
283
- ans << assoc.klass unless ans.include?(assoc.klass)
284
- # There is some potential for duplicates when there is an HM-based where in play. De-duplicate if so.
285
- has_hm ||= assoc.macro == :has_many
286
- join_array[assoc_name] = nil # Store this relation name in our special collection for .joins()
287
- end
288
- wheres[k] = v.split(',')
289
- end
290
- # distinct! if has_hm
291
278
 
292
279
  # %%% Skip the metadata columns
293
280
  if selects&.empty? # Default to all columns
@@ -301,59 +288,101 @@ module ActiveRecord
301
288
  if is_add_bts || is_add_hms
302
289
  bts, hms, associatives = ::Brick.get_bts_and_hms(klass)
303
290
  bts.each do |_k, bt|
304
- # join_array[bt.first] = nil # Store this relation name in our special collection for .joins()
291
+ # join_array will receive this relation name when calling #brick_parse_dsl
305
292
  bt_descrip[bt.first] = [bt.last, bt.last.brick_parse_dsl(join_array, bt.first, translations)]
306
293
  end
307
294
  skip_klass_hms = ::Brick.config.skip_index_hms[klass.name] || {}
308
295
  hms.each do |k, hm|
309
296
  next if skip_klass_hms.key?(k)
310
297
 
311
- join_array[k] = nil # Store this relation name in our special collection for .joins()
312
- hm_counts[k] = nil # Placeholder that will be filled in once we know the proper table alias
298
+ hm_counts[k] = hm
313
299
  end
314
300
  end
315
- where!(wheres) unless wheres.empty?
301
+
302
+ wheres = {}
303
+ params.each do |k, v|
304
+ case (ks = k.split('.')).length
305
+ when 1
306
+ next unless klass._brick_get_fks.include?(k)
307
+ when 2
308
+ assoc_name = ks.first.to_sym
309
+ # Make sure it's a good association name and that the model has that column name
310
+ next unless klass.reflect_on_association(assoc_name)&.klass&.columns&.any? { |col| col.name == ks.last }
311
+
312
+ join_array[assoc_name] = nil # Store this relation name in our special collection for .joins()
313
+ end
314
+ wheres[k] = v.split(',')
315
+ end
316
+
316
317
  if join_array.present?
317
318
  left_outer_joins!(join_array) # joins!(join_array)
318
319
  # Without working from a duplicate, touching the AREL ast tree sets the @arel instance variable, which causes the relation to be immutable.
319
320
  (rel_dupe = dup)._arel_alias_names
320
321
  core_selects = selects.dup
321
- groups = []
322
322
  chains = rel_dupe._brick_chains
323
- id_for_tables = {}
323
+ id_for_tables = Hash.new { |h, k| h[k] = [] }
324
+ field_tbl_names = Hash.new { |h, k| h[k] = {} }
324
325
  bt_columns = bt_descrip.each_with_object([]) do |v, s|
325
- tbl_name = chains[v.last.first].first
326
- if (id_col = v.last.first.primary_key) && !id_for_tables.key?(tbl_name)
327
- groups << (unaliased = "#{tbl_name}.#{id_col}")
328
- selects << "#{unaliased} AS \"#{(id_alias = id_for_tables[tbl_name] = "_brfk_#{v.first}__#{id_col}")}\""
329
- v.last << id_alias
326
+ tbl_name = field_tbl_names[v.first][v.last.first] ||= shift_or_first(chains[v.last.first])
327
+ if (id_col = v.last.first.primary_key) && !id_for_tables.key?(v.first) # was tbl_name
328
+ # Accommodate composite primary key by allowing id_col to come in as an array
329
+ (id_col.is_a?(Array) ? id_col : [id_col]).each do |id_part|
330
+ selects << "#{"#{tbl_name}.#{id_part}"} AS \"#{(id_alias = "_brfk_#{v.first}__#{id_part}")}\""
331
+ id_for_tables[v.first] << id_alias
332
+ end
333
+ v.last << id_for_tables[v.first]
330
334
  end
331
335
  if (col_name = v.last[1].last&.last)
336
+ field_tbl_name = nil
332
337
  v.last[1].map { |x| [translations[x[0..-2].map(&:to_s).join('.')], x.last] }.each_with_index do |sel_col, idx|
333
- groups << (unaliased = "#{tbl_name = chains[sel_col.first].first}.#{sel_col.last}")
338
+ field_tbl_name ||= field_tbl_names[v.first][sel_col.first] ||= shift_or_first(chains[sel_col.first])
334
339
  # col_name is weak when there are multiple, using sel_col.last instead
335
- tbl_name2 = tbl_name.start_with?('public.') ? tbl_name[7..-1] : tbl_name
336
- selects << "#{unaliased} AS \"#{(col_alias = "_brfk_#{tbl_name2}__#{sel_col.last}")}\""
340
+ selects << "#{"#{field_tbl_name}.#{sel_col.last}"} AS \"#{(col_alias = "_brfk_#{v.first}__#{sel_col.last}")}\""
337
341
  v.last[1][idx] << col_alias
338
342
  end
339
343
  end
340
344
  end
341
- group!(core_selects + groups) if hm_counts.any? # + bt_columns
342
345
  join_array.each do |assoc_name|
343
346
  # %%% Need to support {user: :profile}
344
347
  next unless assoc_name.is_a?(Symbol)
345
348
 
346
- klass = reflect_on_association(assoc_name)&.klass
347
- table_alias = chains[klass].length > 1 ? chains[klass].shift : chains[klass].first
349
+ table_alias = shift_or_first(chains[klass = reflect_on_association(assoc_name)&.klass])
348
350
  _assoc_names[assoc_name] = [table_alias, klass]
349
351
  end
350
- # Copy entries over
351
- hm_counts.keys.each do |k|
352
- hm_counts[k] = _assoc_names[k]
352
+ end
353
+ # Add derived table JOIN for the has_many counts
354
+ hm_counts.each do |k, hm|
355
+ associative = nil
356
+ count_column = if hm.options[:through]
357
+ fk_col = (associative = associatives[hm.name]).foreign_key
358
+ hm.foreign_key
359
+ else
360
+ fk_col = hm.foreign_key
361
+ hm.klass.primary_key || '*'
362
+ end
363
+ tbl_alias = "_br_#{hm.name}"
364
+ pri_tbl = hm.active_record
365
+ if fk_col.is_a?(Array) # Composite key?
366
+ on_clause = []
367
+ fk_col.each_with_index { |fk_col_part, idx| on_clause << "#{tbl_alias}.#{fk_col_part} = #{pri_tbl.table_name}.#{pri_tbl.primary_key[idx]}" }
368
+ joins!("LEFT OUTER
369
+ JOIN (SELECT #{fk_col.join(', ')}, COUNT(#{count_column}) AS _ct_ FROM #{associative&.name || hm.klass.table_name} GROUP BY #{(1..fk_col.length).to_a.join(', ')}) AS #{tbl_alias}
370
+ ON #{on_clause.join(' AND ')}")
371
+ else
372
+ joins!("LEFT OUTER
373
+ JOIN (SELECT #{fk_col}, COUNT(#{count_column}) AS _ct_ FROM #{associative&.name || hm.klass.table_name} GROUP BY 1) AS #{tbl_alias}
374
+ ON #{tbl_alias}.#{fk_col} = #{pri_tbl.table_name}.#{pri_tbl.primary_key}")
353
375
  end
354
376
  end
377
+ where!(wheres) unless wheres.empty?
355
378
  wheres unless wheres.empty? # Return the specific parameters that we did use
356
379
  end
380
+
381
+ private
382
+
383
+ def shift_or_first(ary)
384
+ ary.length > 1 ? ary.shift : ary.first
385
+ end
357
386
  end
358
387
 
359
388
  module Inheritance
@@ -552,27 +581,30 @@ class Object
552
581
  # Do the bulk of the has_many / belongs_to processing, and store details about HMT so they can be done at the very last
553
582
  hmts = fks.each_with_object(Hash.new { |h, k| h[k] = [] }) do |fk, hmts|
554
583
  # The key in each hash entry (fk.first) is the constraint name
555
- assoc_name = (assoc = fk.last)[:assoc_name]
556
- inverse_assoc_name = assoc[:inverse]&.fetch(:assoc_name, nil)
584
+ inverse_assoc_name = (assoc = fk.last)[:inverse]&.fetch(:assoc_name, nil)
557
585
  options = {}
558
586
  singular_table_name = ActiveSupport::Inflector.singularize(assoc[:inverse_table])
559
587
  macro = if assoc[:is_bt]
560
588
  # Try to take care of screwy names if this is a belongs_to going to an STI subclass
561
- if (primary_class = assoc.fetch(:primary_class, nil)) &&
562
- (sti_inverse_assoc = primary_class.reflect_on_all_associations.find { |a| a.macro == :has_many && a.options[:class_name] == self.name && assoc[:fk] = a.foreign_key })
563
- assoc_name = sti_inverse_assoc.options[:inverse_of].to_s || assoc_name
564
- end
589
+ assoc_name = if (primary_class = assoc.fetch(:primary_class, nil)) &&
590
+ sti_inverse_assoc = primary_class.reflect_on_all_associations.find do |a|
591
+ a.macro == :has_many && a.options[:class_name] == self.name && assoc[:fk] = a.foreign_key
592
+ end
593
+ sti_inverse_assoc.options[:inverse_of]&.to_s || assoc_name
594
+ else
595
+ assoc[:assoc_name]
596
+ end
565
597
  need_class_name = singular_table_name.underscore != assoc_name
566
598
  need_fk = "#{assoc_name}_id" != assoc[:fk]
567
599
  if (inverse = assoc[:inverse])
568
600
  inverse_assoc_name, _x = _brick_get_hm_assoc_name(relations[assoc[:inverse_table]], inverse)
569
601
  if (has_ones = ::Brick.config.has_ones&.fetch(inverse[:alternate_name].camelize, nil))&.key?(singular_inv_assoc_name = ActiveSupport::Inflector.singularize(inverse_assoc_name))
570
602
  inverse_assoc_name = if has_ones[singular_inv_assoc_name]
571
- need_inverse_of = true
572
- has_ones[singular_inv_assoc_name]
573
- else
574
- singular_inv_assoc_name
575
- end
603
+ need_inverse_of = true
604
+ has_ones[singular_inv_assoc_name]
605
+ else
606
+ singular_inv_assoc_name
607
+ end
576
608
  end
577
609
  end
578
610
  :belongs_to
@@ -583,12 +615,12 @@ class Object
583
615
  need_fk = "#{ActiveSupport::Inflector.singularize(assoc[:inverse][:inverse_table])}_id" != assoc[:fk]
584
616
  # fks[table_name].find { |other_assoc| other_assoc.object_id != assoc.object_id && other_assoc[:assoc_name] == assoc[assoc_name] }
585
617
  if (has_ones = ::Brick.config.has_ones&.fetch(model_name, nil))&.key?(singular_assoc_name = ActiveSupport::Inflector.singularize(assoc_name))
586
- assoc_name = if has_ones[singular_assoc_name]
587
- need_class_name = true
588
- has_ones[singular_assoc_name]
589
- else
590
- singular_assoc_name
591
- end
618
+ assoc_name = if (custom_assoc_name = has_ones[singular_assoc_name])
619
+ need_class_name = custom_assoc_name != singular_assoc_name
620
+ custom_assoc_name
621
+ else
622
+ singular_assoc_name
623
+ end
592
624
  :has_one
593
625
  else
594
626
  :has_many
@@ -674,7 +706,7 @@ class Object
674
706
  @_brick_params = ar_relation.brick_select(params, (selects = []), (bt_descrip = {}), (hm_counts = {}), (join_array = ::Brick::JoinArray.new))
675
707
  # %%% Add custom HM count columns
676
708
  # %%% What happens when the PK is composite?
677
- counts = hm_counts.each_with_object([]) { |v, s| s << "COUNT(DISTINCT #{v.last.first}.#{v.last.last.primary_key}) AS _br_#{v.first}_ct" }
709
+ counts = hm_counts.each_with_object([]) { |v, s| s << "_br_#{v.first}._ct_ AS _br_#{v.first}_ct" }
678
710
  # *selects,
679
711
  instance_variable_set("@#{table_name}".to_sym, ar_relation.dup._select!(*selects, *counts))
680
712
  # binding.pry
@@ -732,7 +764,8 @@ class Object
732
764
 
733
765
  def _brick_get_hm_assoc_name(relation, hm_assoc)
734
766
  if relation[:hm_counts][hm_assoc[:assoc_name]]&.> 1
735
- [ActiveSupport::Inflector.pluralize(hm_assoc[:alternate_name]), true]
767
+ plural = ActiveSupport::Inflector.pluralize(hm_assoc[:alternate_name])
768
+ [hm_assoc[:alternate_name] == name.underscore ? "#{hm_assoc[:assoc_name].singularize}_#{plural}" : plural, true]
736
769
  else
737
770
  [ActiveSupport::Inflector.pluralize(hm_assoc[:inverse_table]), nil]
738
771
  end
@@ -989,18 +1022,16 @@ module Brick
989
1022
 
990
1023
  return if is_class || ::Brick.config.exclude_hms&.any? { |exclusion| fk[0] == exclusion[0] && fk[1] == exclusion[1] && primary_table == exclusion[2] }
991
1024
 
992
- cnstr_name = "hm_#{cnstr_name}"
993
- if (assoc_hm = hms.fetch(cnstr_name, nil))
1025
+ if (assoc_hm = hms.fetch((hm_cnstr_name = "hm_#{cnstr_name}"), nil))
994
1026
  assoc_hm[:fk] = assoc_hm[:fk].is_a?(String) ? [assoc_hm[:fk], fk[1]] : assoc_hm[:fk].concat(fk[1])
995
1027
  assoc_hm[:alternate_name] = "#{assoc_hm[:alternate_name]}_#{bt_assoc_name}" unless assoc_hm[:alternate_name] == bt_assoc_name
996
1028
  assoc_hm[:inverse] = assoc_bt
997
1029
  else
998
- assoc_hm = hms[cnstr_name] = { is_bt: false, fk: fk[1], assoc_name: fk[0], alternate_name: bt_assoc_name, inverse_table: fk[0], inverse: assoc_bt }
1030
+ assoc_hm = hms[hm_cnstr_name] = { is_bt: false, fk: fk[1], assoc_name: fk[0], alternate_name: bt_assoc_name, inverse_table: fk[0], inverse: assoc_bt }
999
1031
  hm_counts = relation.fetch(:hm_counts) { relation[:hm_counts] = {} }
1000
1032
  hm_counts[fk[0]] = hm_counts.fetch(fk[0]) { 0 } + 1
1001
1033
  end
1002
1034
  assoc_bt[:inverse] = assoc_hm
1003
- # hms[cnstr_name] << { is_bt: false, fk: fk[1], assoc_name: fk[0], alternate_name: bt_assoc_name, inverse_table: fk[0] }
1004
1035
  end
1005
1036
  end
1006
1037
  end
@@ -64,6 +64,14 @@ module Brick
64
64
  is_template_exists
65
65
  end
66
66
 
67
+ def path_keys(fk_name, obj_name, pk)
68
+ if fk_name.is_a?(Array) && pk.is_a?(Array) # Composite keys?
69
+ fk_name.zip(pk.map { |pk_part| "#{obj_name}.#{pk_part}" })
70
+ else
71
+ [[fk_name, "#{obj_name}.#{pk}"]]
72
+ end.map { |x| "#{x.first}: #{x.last}"}.join(', ')
73
+ end
74
+
67
75
  alias :_brick_find_template :find_template
68
76
  def find_template(*args, **options)
69
77
  return _brick_find_template(*args, **options) unless @_brick_model
@@ -73,35 +81,32 @@ module Brick
73
81
  obj_name = model_name.underscore
74
82
  table_name = model_name.pluralize.underscore
75
83
  bts, hms, associatives = ::Brick.get_bts_and_hms(@_brick_model) # This gets BT and HM and also has_many :through (HMT)
76
- hms_columns = +'' # Used for 'index'
84
+ hms_columns = [] # Used for 'index'
77
85
  skip_klass_hms = ::Brick.config.skip_index_hms[model_name] || {}
78
86
  hms_headers = hms.each_with_object([]) do |hm, s|
79
- hm_assoc = hm.last
80
- if args.first == 'index'
81
- hm_fk_name = if hm_assoc.options[:through]
82
- associative = associatives[hm_assoc.name]
83
- "'#{associative.name}.#{associative.foreign_key}'"
84
- else
85
- hm_assoc.foreign_key
86
- end
87
- hms_columns << if hm_assoc.macro == :has_many
88
- set_ct = if skip_klass_hms.key?((assoc_name = hm.first).to_sym)
89
- 'nil'
87
+ hm_stuff = [(hm_assoc = hm.last), "H#{hm_assoc.macro == :has_one ? 'O' : 'M'}#{'T' if hm_assoc.options[:through]}", (assoc_name = hm.first)]
88
+ hm_fk_name = if hm_assoc.options[:through]
89
+ associative = associatives[hm_assoc.name]
90
+ "'#{associative.name}.#{associative.foreign_key}'"
90
91
  else
91
- "#{obj_name}._br_#{assoc_name}_ct"
92
+ hm_assoc.foreign_key
92
93
  end
93
-
94
- "<td>
95
- <%= ct = #{set_ct}
96
- link_to \"#\{ct || 'View'\} #{assoc_name}\", #{hm_assoc.klass.name.underscore.pluralize}_path({ #{hm_fk_name}: #{obj_name}.#{pk} }) unless ct&.zero? %>
97
- </td>\n"
94
+ if args.first == 'index'
95
+ hms_columns << if hm_assoc.macro == :has_many
96
+ set_ct = if skip_klass_hms.key?(assoc_name.to_sym)
97
+ 'nil'
98
+ else
99
+ "#{obj_name}._br_#{assoc_name}_ct || 0"
100
+ end
101
+ "<%= ct = #{set_ct}
102
+ link_to \"#\{ct || 'View'\} #{assoc_name}\", #{hm_assoc.klass.name.underscore.pluralize}_path({ #{path_keys(hm_fk_name, obj_name, pk)} }) unless ct&.zero? %>\n"
98
103
  else # has_one
99
- "<td>
100
- <%= obj = #{obj_name}.#{hm.first}; link_to(obj.brick_descrip, obj) if obj %>
101
- </td>\n"
104
+ "<%= obj = #{obj_name}.#{hm.first}; link_to(obj.brick_descrip, obj) if obj %>\n"
102
105
  end
106
+ elsif args.first == 'show'
107
+ hm_stuff << "<%= link_to '#{assoc_name}', #{hm_assoc.klass.name.underscore.pluralize}_path({ #{path_keys(hm_fk_name, "@#{obj_name}&.first&", pk)} }) %>\n"
103
108
  end
104
- s << [hm_assoc, "H#{hm_assoc.macro == :has_one ? 'O' : 'M'}#{'T' if hm_assoc.options[:through]} #{hm.first}"]
109
+ s << hm_stuff
105
110
  end
106
111
 
107
112
  schema_options = ::Brick.db_schemas.each_with_object(+'') { |v, s| s << "<option value=\"#{v}\">#{v}</option>" }.html_safe
@@ -121,9 +126,12 @@ table {
121
126
 
122
127
  table thead tr th, table tr th {
123
128
  background-color: #009879;
124
- color: #ffffff;
129
+ color: #fff;
125
130
  text-align: left;
126
131
  }
132
+ table thead tr th a, table tr th a {
133
+ color: #80FFB8;
134
+ }
127
135
 
128
136
  table th, table td {
129
137
  padding: 0.2em 0.5em;
@@ -132,6 +140,9 @@ table th, table td {
132
140
  .show-field {
133
141
  background-color: #004998;
134
142
  }
143
+ .show-field a {
144
+ color: #80B8D2;
145
+ }
135
146
 
136
147
  table tbody tr {
137
148
  border-bottom: thin solid #dddddd;
@@ -244,6 +255,11 @@ function changeout(href, param, value) {
244
255
  </script>"
245
256
  inline = case args.first
246
257
  when 'index'
258
+ obj_pk = if pk&.is_a?(Array) # Composite primary key?
259
+ "[#{pk.map { |pk_part| "#{obj_name}.#{pk_part}" }.join(', ')}]"
260
+ elsif pk
261
+ "#{obj_name}.#{pk}"
262
+ end
247
263
  "#{css}
248
264
  <p style=\"color: green\"><%= notice %></p>#{"
249
265
  <select id=\"schema\">#{schema_options}</select>" if ::Brick.db_schemas.length > 1}
@@ -256,26 +272,27 @@ function changeout(href, param, value) {
256
272
  <% next if col == '#{pk}' || ::Brick.config.metadata_columns.include?(col) %>
257
273
  <th>
258
274
  <% if (bt = bts[col]) %>
259
- BT <%= \"#\{bt.first\}-\" unless bt[1].name.underscore == bt.first.to_s %><%= bt[1].name %>
275
+ BT <%= bt[1].bt_link(bt.first) %>
260
276
  <% else %>
261
277
  <%= col %>
262
278
  <% end %>
263
279
  </th>
264
280
  <% end %>
265
- #{hms_headers.map { |h| "<th>#{h.last}</th>\n" }.join}
281
+ <%# Consider getting the name from the association -- h.first.name -- if a more \"friendly\" alias should be used for a screwy table name %>
282
+ #{hms_headers.map { |h| "<th>#{h[1]} <%= link_to('#{h[2]}', #{h.first.klass.name.underscore.pluralize}_path) %></th>\n" }.join}
266
283
  </tr></thead>
267
284
 
268
285
  <tbody>
269
286
  <% @#{table_name}.each do |#{obj_name}| %>
270
287
  <tr>#{"
271
- <td><%= link_to '⇛', #{obj_name}_path(#{obj_name}.#{pk}), { class: 'big-arrow' } %></td>" if pk}
288
+ <td><%= link_to '⇛', #{obj_name}_path(#{obj_pk}), { class: 'big-arrow' } %></td>" if pk}
272
289
  <% #{obj_name}.attributes.each do |k, val| %>
273
290
  <% next if k == '#{pk}' || ::Brick.config.metadata_columns.include?(k) || k.start_with?('_brfk_') || (k.start_with?('_br_') && k.end_with?('_ct')) %>
274
291
  <td>
275
292
  <% if (bt = bts[k]) %>
276
- <%# binding.pry if bt.first == :user %>
277
- <% bt_txt = bt[1].brick_descrip(#{obj_name}, @_brick_bt_descrip[bt.first][1].map { |z| #{obj_name}.send(z.last) }, @_brick_bt_descrip[bt.first][2]) %>
278
- <% bt_id_col = @_brick_bt_descrip[bt.first][2]; bt_id = #{obj_name}.send(bt_id_col) if bt_id_col %>
293
+ <%# binding.pry # Postgres column names are limited to 63 characters!!! %>
294
+ <% bt_txt = bt[1].brick_descrip(#{obj_name}, @_brick_bt_descrip[bt.first][1].map { |z| #{obj_name}.send(z.last[0..62]) }, @_brick_bt_descrip[bt.first][2]) %>
295
+ <% bt_id_col = @_brick_bt_descrip[bt.first][2]; bt_id = #{obj_name}.send(*bt_id_col) if bt_id_col&.present? %>
279
296
  <%= bt_id ? link_to(bt_txt, send(\"#\{bt_obj_path_base = bt[1].name.underscore\}_path\".to_sym, bt_id)) : bt_txt %>
280
297
  <%#= Previously was: bt_obj = bt[1].find_by(bt[2] => val); link_to(bt_obj.brick_descrip, send(\"#\{bt_obj_path_base = bt[1].name.underscore\}_path\".to_sym, bt_obj.send(bt[1].primary_key.to_sym))) if bt_obj %>
281
298
  <% else %>
@@ -283,7 +300,7 @@ function changeout(href, param, value) {
283
300
  <% end %>
284
301
  </td>
285
302
  <% end %>
286
- #{hms_columns}
303
+ <td>#{hms_columns.join('</td><td>')}</td>
287
304
  <!-- td>X</td -->
288
305
  </tr>
289
306
  </tbody>
@@ -301,9 +318,9 @@ function changeout(href, param, value) {
301
318
  <%= link_to '(See all #{obj_name.pluralize})', #{table_name}_path %>
302
319
  <% if obj %>
303
320
  <%= # path_options = [obj.#{pk}]
304
- # path_options << { '_brick_schema': } if
321
+ # path_options << { '_brick_schema': } if
305
322
  # url = send(:#{model_name.underscore}_path, obj.#{pk})
306
- form_for(obj) do |f| %>
323
+ form_for(obj.becomes(#{model_name})) do |f| %>
307
324
  <table>
308
325
  <% @#{obj_name}.first.attributes.each do |k, val| %>
309
326
  <tr>
@@ -317,7 +334,7 @@ function changeout(href, param, value) {
317
334
  bt << (option_detail = [[\"(No #\{bt_name\} chosen)\", '^^^brick_NULL^^^']])
318
335
  bt[1].order(:#{pk}).each { |obj| option_detail << [obj.brick_descrip, obj.#{pk}] }
319
336
  end %>
320
- BT <%= \"#\{bt.first\}-\" unless bt_name.underscore == bt.first.to_s %><%= bt_name %>
337
+ BT <%= bt[1].bt_link(bt.first) %>
321
338
  <% else %>
322
339
  <%= k %>
323
340
  <% end %>
@@ -353,21 +370,24 @@ function changeout(href, param, value) {
353
370
  </table>
354
371
  <% end %>
355
372
 
356
- #{hms_headers.map do |hm|
357
- next unless (pk = hm.first.klass.primary_key)
358
-
359
- "<table id=\"#{hm_name = hm.first.name.to_s}\">
360
- <tr><th>#{hm.last}</th></tr>
361
- <% collection = @#{obj_name}.first.#{hm_name}
362
- collection = collection.is_a?(ActiveRecord::Associations::CollectionProxy) ? collection.order(#{pk.inspect}) : [collection]
363
- if collection.empty? %>
364
- <tr><td>(none)</td></tr>
365
- <% else %>
366
- <% collection.uniq.each do |#{hm_singular_name = hm_name.singularize.underscore}| %>
367
- <tr><td><%= link_to(#{hm_singular_name}.brick_descrip, #{hm.first.klass.name.underscore}_path(#{hm_singular_name}.#{pk})) %></td></tr>
368
- <% end %>
369
- <% end %>
370
- </table>" end.join}
373
+ #{hms_headers.each_with_object(+'') do |hm, s|
374
+ if (pk = hm.first.klass.primary_key)
375
+ s << "<table id=\"#{hm_name = hm.first.name.to_s}\">
376
+ <tr><th>#{hm[3]}</th></tr>
377
+ <% collection = @#{obj_name}.first.#{hm_name}
378
+ collection = collection.is_a?(ActiveRecord::Associations::CollectionProxy) ? collection.order(#{pk.inspect}) : [collection]
379
+ if collection.empty? %>
380
+ <tr><td>(none)</td></tr>
381
+ <% else %>
382
+ <% collection.uniq.each do |#{hm_singular_name = hm_name.singularize.underscore}| %>
383
+ <tr><td><%= link_to(#{hm_singular_name}.brick_descrip, #{hm.first.klass.name.underscore}_path(#{hm_singular_name}.#{pk})) %></td></tr>
384
+ <% end %>
385
+ <% end %>
386
+ </table>"
387
+ else
388
+ s
389
+ end
390
+ end}
371
391
  <% end %>
372
392
  #{script}"
373
393
 
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 21
8
+ TINY = 22
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
data/lib/brick.rb CHANGED
@@ -105,9 +105,6 @@ module Brick
105
105
  bts, hms = model.reflect_on_all_associations.each_with_object([{}, {}]) do |a, s|
106
106
  next if !const_defined?(a.name.to_s.singularize.camelize) && ::Brick.config.exclude_tables.include?(a.plural_name)
107
107
 
108
- # So that we can map an association name to any special alias name used in an AREL query
109
- ans = (model._assoc_names[a.name] ||= [])
110
- ans << a.klass unless ans.include?(a.klass)
111
108
  case a.macro
112
109
  when :belongs_to
113
110
  s.first[a.foreign_key] = [a.name, a.klass]
@@ -427,9 +424,7 @@ ActiveSupport.on_load(:active_record) do
427
424
  end
428
425
 
429
426
  result = result.map do |attributes|
430
- values = klass.initialize_attributes(attributes).values
431
-
432
- columns.zip(values).map do |column, value|
427
+ columns.zip(klass.initialize_attributes(attributes).values).map do |column, value|
433
428
  column.type_cast(value)
434
429
  end
435
430
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brick
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.21
4
+ version: 1.0.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-05 00:00:00.000000000 Z
11
+ date: 2022-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord