brick 1.0.27 → 1.0.28
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 +4 -4
- data/lib/brick/extensions.rb +45 -29
- data/lib/brick/frameworks/rails/engine.rb +18 -12
- data/lib/brick/join_array.rb +1 -1
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +3 -3
- data/lib/generators/brick/install_generator.rb +8 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab7e6a8198638a0e6d3cde289db17d107e699fad2b4b5a200703cb1982d19569
|
4
|
+
data.tar.gz: 708360bb9463e45c8f7fece60dc762dc65b2b3893d8044ffce9ee87e33f63b80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92229661eff9aac30ec7fad96603bc649a122131956e8632562e22d11c8bae67db0272ec5453ab2cc233bd11f7ab72222c3520f2acceecb83e35d4c54cbd8f4d
|
7
|
+
data.tar.gz: ddc169b2effaf58e60861d0153f191f6f1e2f11d459363a000da2c1f44c1583c8cd037f78269c238a84de58e04d7633c7a7ecbf046c08ef48fdaf5fb01de76a3
|
data/lib/brick/extensions.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Some future enhancement ideas:
|
4
|
+
|
3
5
|
# Have markers on HM relationships to indicate "load this one every time" or "lazy load it" or "don't bother"
|
4
6
|
# Others on BT to indicate "this is a lookup"
|
5
7
|
|
@@ -18,7 +20,7 @@
|
|
18
20
|
# Sensitive stuff -- make a lock icon thing so people don't accidentally edit stuff
|
19
21
|
|
20
22
|
# Static text that can go on pages - headings and footers and whatever
|
21
|
-
# Eventually some indication about if it should be a paginated table / unpaginated / a list of just some fields / etc
|
23
|
+
# Eventually some indication about if it should be a paginated table / unpaginated / a list of just some fields / columns shown in a different sequence / etc
|
22
24
|
|
23
25
|
# Grid where each cell is one field and then when you mouse over then it shows a popup other table of detail inside
|
24
26
|
|
@@ -32,6 +34,9 @@
|
|
32
34
|
|
33
35
|
# Currently quadrupling up routes
|
34
36
|
|
37
|
+
# Modal pop-up things for editing large text / date ranges / hierarchies of data
|
38
|
+
|
39
|
+
# For recognised self-references, have the show page display all related objects up to the parent (or the start of a circular reference)
|
35
40
|
|
36
41
|
# ==========================================================
|
37
42
|
# Dynamically create model or controller classes when needed
|
@@ -62,6 +67,14 @@ module ActiveRecord
|
|
62
67
|
false
|
63
68
|
end
|
64
69
|
|
70
|
+
def self._brick_primary_key(relation = nil)
|
71
|
+
return instance_variable_get(:@_brick_primary_key) if instance_variable_defined?(:@_brick_primary_key)
|
72
|
+
|
73
|
+
pk = primary_key.is_a?(String) ? [primary_key] : primary_key || []
|
74
|
+
# Just return [] if we're missing any part of the primary key. (PK is usually just "id")
|
75
|
+
@_brick_primary_key ||= pk.any? { |pk_part| !relation[:cols].key?(pk_part) } ? [] : pk
|
76
|
+
end
|
77
|
+
|
65
78
|
# Used to show a little prettier name for an object
|
66
79
|
def self.brick_get_dsl
|
67
80
|
# If there's no DSL yet specified, just try to find the first usable column on this model
|
@@ -344,17 +357,13 @@ module ActiveRecord
|
|
344
357
|
next if chains[k1].nil?
|
345
358
|
|
346
359
|
tbl_name = field_tbl_names[v.first][k1] ||= shift_or_first(chains[k1])
|
347
|
-
# if (col_name = v1[1].last&.last) # col_name is weak when there are multiple, using sel_col.last instead
|
348
360
|
field_tbl_name = nil
|
349
|
-
v1.map { |x|
|
350
|
-
|
351
|
-
}.each_with_index do |sel_col, idx|
|
352
|
-
field_tbl_name ||= field_tbl_names[v.first][sel_col.first] ||= shift_or_first(chains[sel_col.first])
|
361
|
+
v1.map { |x| [translations[x[0..-2].map(&:to_s).join('.')], x.last] }.each_with_index do |sel_col, idx|
|
362
|
+
field_tbl_name = field_tbl_names[v.first][sel_col.first] ||= shift_or_first(chains[sel_col.first])
|
353
363
|
|
354
364
|
selects << "#{"#{field_tbl_name}.#{sel_col.last}"} AS \"#{(col_alias = "_brfk_#{v.first}__#{sel_col.last}")}\""
|
355
365
|
v1[idx] << col_alias
|
356
366
|
end
|
357
|
-
# end
|
358
367
|
|
359
368
|
unless id_for_tables.key?(v.first)
|
360
369
|
# Accommodate composite primary key by allowing id_col to come in as an array
|
@@ -524,7 +533,7 @@ class Object
|
|
524
533
|
singular_table_name = ActiveSupport::Inflector.underscore(model_name)
|
525
534
|
|
526
535
|
# Adjust for STI if we know of a base model for the requested model name
|
527
|
-
table_name = if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, ::Brick.existing_stis[model_name]&.constantize)
|
536
|
+
table_name = if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil) || ::Brick.existing_stis[model_name]&.constantize)
|
528
537
|
base_model.table_name
|
529
538
|
else
|
530
539
|
ActiveSupport::Inflector.pluralize(singular_table_name)
|
@@ -565,7 +574,7 @@ class Object
|
|
565
574
|
return
|
566
575
|
end
|
567
576
|
|
568
|
-
if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, ::Brick.existing_stis[model_name]&.constantize)
|
577
|
+
if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil) || ::Brick.existing_stis[model_name]&.constantize)
|
569
578
|
is_sti = true
|
570
579
|
else
|
571
580
|
base_model = ::Brick.config.models_inherit_from || ActiveRecord::Base
|
@@ -585,16 +594,14 @@ class Object
|
|
585
594
|
code << " def self.is_view?; true; end\n"
|
586
595
|
end
|
587
596
|
|
588
|
-
# Missing a primary key column? (Usually "id")
|
589
|
-
ar_pks = primary_key.is_a?(String) ? [primary_key] : primary_key || []
|
590
597
|
db_pks = relation[:cols]&.map(&:first)
|
591
|
-
has_pk =
|
598
|
+
has_pk = _brick_primary_key(relation).length.positive? && (db_pks & _brick_primary_key).sort == _brick_primary_key.sort
|
592
599
|
our_pks = relation[:pkey].values.first
|
593
600
|
# No primary key, but is there anything UNIQUE?
|
594
601
|
# (Sort so that if there are multiple UNIQUE constraints we'll pick one that uses the least number of columns.)
|
595
602
|
our_pks = relation[:ukeys].values.sort { |a, b| a.length <=> b.length }.first unless our_pks&.present?
|
596
603
|
if has_pk
|
597
|
-
code << " # Primary key: #{
|
604
|
+
code << " # Primary key: #{_brick_primary_key.join(', ')}\n" unless _brick_primary_key == ['id']
|
598
605
|
elsif our_pks&.present?
|
599
606
|
if our_pks.length > 1 && respond_to?(:'primary_keys=') # Using the composite_primary_keys gem?
|
600
607
|
new_model_class.primary_keys = our_pks
|
@@ -614,10 +621,13 @@ class Object
|
|
614
621
|
# The key in each hash entry (fk.first) is the constraint name
|
615
622
|
inverse_assoc_name = (assoc = fk.last)[:inverse]&.fetch(:assoc_name, nil)
|
616
623
|
if (invs = assoc[:inverse_table]).is_a?(Array)
|
617
|
-
|
618
|
-
|
619
|
-
|
624
|
+
if assoc[:is_bt]
|
625
|
+
invs = invs.first # Just do the first one of what would be multiple identical polymorphic belongs_to
|
626
|
+
else
|
627
|
+
invs.each { |inv| build_bt_or_hm(relations, model_name, relation, hmts, assoc, inverse_assoc_name, inv, code) }
|
628
|
+
end
|
620
629
|
end
|
630
|
+
build_bt_or_hm(relations, model_name, relation, hmts, assoc, inverse_assoc_name, invs, code) unless invs.is_a?(Array)
|
621
631
|
hmts
|
622
632
|
end
|
623
633
|
hmts.each do |hmt_fk, fks|
|
@@ -644,7 +654,7 @@ class Object
|
|
644
654
|
# # Not NULLables
|
645
655
|
# # %%% For the minute we've had to pull this out because it's been troublesome implementing the NotNull validator
|
646
656
|
# relation[:cols].each do |col, datatype|
|
647
|
-
# if (datatype[3] &&
|
657
|
+
# if (datatype[3] && _brick_primary_key.exclude?(col) && ::Brick.config.metadata_columns.exclude?(col)) ||
|
648
658
|
# ::Brick.config.not_nullables.include?("#{matching}.#{col}")
|
649
659
|
# code << " validates :#{col}, not_null: true\n"
|
650
660
|
# self.send(:validates, col.to_sym, { not_null: true })
|
@@ -741,13 +751,14 @@ class Object
|
|
741
751
|
def build_controller(class_name, plural_class_name, model, relations)
|
742
752
|
table_name = ActiveSupport::Inflector.underscore(plural_class_name)
|
743
753
|
singular_table_name = ActiveSupport::Inflector.singularize(table_name)
|
754
|
+
pk = model._brick_primary_key(relations[table_name])
|
744
755
|
|
745
756
|
code = +"class #{class_name} < ApplicationController\n"
|
746
757
|
built_controller = Class.new(ActionController::Base) do |new_controller_class|
|
747
758
|
Object.const_set(class_name.to_sym, new_controller_class)
|
748
759
|
|
749
760
|
code << " def index\n"
|
750
|
-
code << " @#{table_name} = #{model.name}#{
|
761
|
+
code << " @#{table_name} = #{model.name}#{pk&.present? ? ".order(#{pk.inspect})" : '.all'}\n"
|
751
762
|
code << " @#{table_name}.brick_select(params)\n"
|
752
763
|
code << " end\n"
|
753
764
|
self.protect_from_forgery unless: -> { self.request.format.js? }
|
@@ -765,7 +776,8 @@ class Object
|
|
765
776
|
return
|
766
777
|
end
|
767
778
|
|
768
|
-
|
779
|
+
order = pk.each_with_object([]) { |pk_part, s| s << "#{model.table_name}.#{pk_part}" }
|
780
|
+
ar_relation = order.present? ? model.order("#{order.join(', ')}") : model.all
|
769
781
|
@_brick_params = ar_relation.brick_select(params, (selects = []), (bt_descrip = {}), (hm_counts = {}), (join_array = ::Brick::JoinArray.new))
|
770
782
|
# %%% Add custom HM count columns
|
771
783
|
# %%% What happens when the PK is composite?
|
@@ -797,6 +809,10 @@ class Object
|
|
797
809
|
code << " # (Define :new, :create)\n"
|
798
810
|
|
799
811
|
if model.primary_key
|
812
|
+
if (schema = ::Brick.config.schema_to_analyse) && ::Brick.db_schemas&.include?(schema)
|
813
|
+
ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?;", schema)
|
814
|
+
end
|
815
|
+
|
800
816
|
is_need_params = true
|
801
817
|
# code << " # (Define :edit, and :destroy)\n"
|
802
818
|
code << " def update\n"
|
@@ -871,12 +887,12 @@ module ActiveRecord::ConnectionHandling
|
|
871
887
|
def _brick_reflect_tables
|
872
888
|
if (relations = ::Brick.relations).empty?
|
873
889
|
# Only for Postgres? (Doesn't work in sqlite3)
|
874
|
-
# puts ActiveRecord::Base.
|
890
|
+
# puts ActiveRecord::Base.execute_sql("SELECT current_setting('SEARCH_PATH')").to_a.inspect
|
875
891
|
|
876
892
|
schema_sql = 'SELECT NULL AS table_schema;'
|
877
893
|
case ActiveRecord::Base.connection.adapter_name
|
878
894
|
when 'PostgreSQL'
|
879
|
-
schema = 'public'
|
895
|
+
schema = 'public' # Too early at this point to be able to pick up: Brick.config.schema_to_analyse
|
880
896
|
schema_sql = 'SELECT DISTINCT table_schema FROM INFORMATION_SCHEMA.tables;'
|
881
897
|
when 'Mysql2'
|
882
898
|
schema = ActiveRecord::Base.connection.current_database
|
@@ -920,7 +936,7 @@ module ActiveRecord::ConnectionHandling
|
|
920
936
|
measures = []
|
921
937
|
case ActiveRecord::Base.connection.adapter_name
|
922
938
|
when 'PostgreSQL', 'SQLite' # These bring back a hash for each row because the query uses column aliases
|
923
|
-
ActiveRecord::Base.
|
939
|
+
ActiveRecord::Base.execute_sql(sql).each do |r|
|
924
940
|
# next if internal_views.include?(r['relation_name']) # Skip internal views such as v_all_assessments
|
925
941
|
relation = relations[(relation_name = r['relation_name'])]
|
926
942
|
relation[:isView] = true if r['table_type'] == 'VIEW'
|
@@ -939,7 +955,7 @@ module ActiveRecord::ConnectionHandling
|
|
939
955
|
# puts "KEY! #{r['relation_name']}.#{col_name} #{r['key']} #{r['const']}" if r['key']
|
940
956
|
end
|
941
957
|
else # MySQL2 acts a little differently, bringing back an array for each row
|
942
|
-
ActiveRecord::Base.
|
958
|
+
ActiveRecord::Base.execute_sql(sql).each do |r|
|
943
959
|
# next if internal_views.include?(r['relation_name']) # Skip internal views such as v_all_assessments
|
944
960
|
relation = relations[(relation_name = r[0])] # here relation represents a table or view from the database
|
945
961
|
relation[:isView] = true if r[1] == 'VIEW' # table_type
|
@@ -1005,11 +1021,11 @@ module ActiveRecord::ConnectionHandling
|
|
1005
1021
|
else
|
1006
1022
|
end
|
1007
1023
|
if sql
|
1008
|
-
::Brick.db_schemas = ActiveRecord::Base.
|
1024
|
+
::Brick.db_schemas = ActiveRecord::Base.execute_sql(schema_sql)
|
1009
1025
|
::Brick.db_schemas = ::Brick.db_schemas.to_a unless ::Brick.db_schemas.is_a?(Array)
|
1010
1026
|
::Brick.db_schemas.map! { |row| row['table_schema'] } unless ::Brick.db_schemas.empty? || ::Brick.db_schemas.first.is_a?(String)
|
1011
1027
|
::Brick.db_schemas -= ['information_schema', 'pg_catalog']
|
1012
|
-
ActiveRecord::Base.
|
1028
|
+
ActiveRecord::Base.execute_sql(sql).each do |fk|
|
1013
1029
|
fk = fk.values unless fk.is_a?(Array)
|
1014
1030
|
::Brick._add_bt_and_hm(fk, relations)
|
1015
1031
|
end
|
@@ -1118,10 +1134,10 @@ module Brick
|
|
1118
1134
|
return if is_class || ::Brick.config.exclude_hms&.any? { |exclusion| fk[0] == exclusion[0] && fk[1] == exclusion[1] && primary_table == exclusion[2] }
|
1119
1135
|
|
1120
1136
|
if (assoc_hm = hms.fetch((hm_cnstr_name = "hm_#{cnstr_name}"), nil))
|
1121
|
-
if
|
1122
|
-
|
1123
|
-
elsif
|
1124
|
-
|
1137
|
+
if assoc_hm[:fk].is_a?(String)
|
1138
|
+
assoc_hm[:fk] = [assoc_hm[:fk], fk[1]] unless fk[1] == assoc_hm[:fk]
|
1139
|
+
elsif assoc_hm[:fk].exclude?(fk[1])
|
1140
|
+
assoc_hm[:fk] << fk[1]
|
1125
1141
|
end
|
1126
1142
|
assoc_hm[:alternate_name] = "#{assoc_hm[:alternate_name]}_#{bt_assoc_name}" unless assoc_hm[:alternate_name] == bt_assoc_name
|
1127
1143
|
assoc_hm[:inverse] = assoc_bt
|
@@ -71,7 +71,8 @@ module Brick
|
|
71
71
|
keys = if fk_name.is_a?(Array) && pk.is_a?(Array) # Composite keys?
|
72
72
|
fk_name.zip(pk.map { |pk_part| "#{obj_name}.#{pk_part}" })
|
73
73
|
else
|
74
|
-
[
|
74
|
+
pk = pk.each_with_object([]) { |pk_part, s| s << "#{obj_name}.#{pk_part}" }
|
75
|
+
[[fk_name, "#{pk.length == 1 ? pk.first : pk.inspect}"]]
|
75
76
|
end
|
76
77
|
keys << [hm_assoc.inverse_of.foreign_type, "#{hm_assoc.active_record.name}"] if hm_assoc.options.key?(:as)
|
77
78
|
keys.map { |x| "#{x.first}: #{x.last}"}.join(', ')
|
@@ -82,7 +83,7 @@ module Brick
|
|
82
83
|
return _brick_find_template(*args, **options) unless @_brick_model
|
83
84
|
|
84
85
|
model_name = @_brick_model.name
|
85
|
-
pk = @_brick_model.
|
86
|
+
pk = @_brick_model._brick_primary_key(::Brick.relations[model_name])
|
86
87
|
obj_name = model_name.underscore
|
87
88
|
table_name = model_name.pluralize.underscore
|
88
89
|
template_link = nil
|
@@ -283,7 +284,7 @@ function changeout(href, param, value) {
|
|
283
284
|
inline = case args.first
|
284
285
|
when 'index'
|
285
286
|
obj_pk = if pk&.is_a?(Array) # Composite primary key?
|
286
|
-
"[#{pk.map { |pk_part| "#{obj_name}.#{pk_part}" }.join(', ')}]"
|
287
|
+
"[#{pk.map { |pk_part| "#{obj_name}.#{pk_part}" }.join(', ')}]" unless pk.empty?
|
287
288
|
elsif pk
|
288
289
|
"#{obj_name}.#{pk}"
|
289
290
|
end
|
@@ -385,9 +386,9 @@ function changeout(href, param, value) {
|
|
385
386
|
|
386
387
|
<% if @_brick_params&.present? %><h3>where <%= @_brick_params.each_with_object([]) { |v, s| s << \"#\{v.first\} = #\{v.last.inspect\}\" }.join(', ') %></h3><% end %>
|
387
388
|
<table id=\"#{table_name}\">
|
388
|
-
<thead><tr>#{'<th></th>' if pk}
|
389
|
+
<thead><tr>#{'<th></th>' if pk.present?}
|
389
390
|
<% @#{table_name}.columns.map(&:name).each do |col| %>
|
390
|
-
<% next if
|
391
|
+
<% next if #{pk.inspect}.include?(col) || ::Brick.config.metadata_columns.include?(col) || poly_cols.include?(col) %>
|
391
392
|
<th>
|
392
393
|
<% if (bt = bts[col]) %>
|
393
394
|
BT <%
|
@@ -408,7 +409,7 @@ function changeout(href, param, value) {
|
|
408
409
|
<tr>#{"
|
409
410
|
<td><%= link_to '⇛', #{obj_name}_path(#{obj_pk}), { class: 'big-arrow' } %></td>" if obj_pk}
|
410
411
|
<% #{obj_name}.attributes.each do |k, val| %>
|
411
|
-
<% next if
|
412
|
+
<% next if #{obj_pk.inspect}.include?(k) || ::Brick.config.metadata_columns.include?(k) || poly_cols.include?(k) || k.start_with?('_brfk_') || (k.start_with?('_br_') && (k.length == 63 || k.end_with?('_ct'))) %>
|
412
413
|
<td>
|
413
414
|
<% if (bt = bts[k]) %>
|
414
415
|
<%# binding.pry # Postgres column names are limited to 63 characters %>
|
@@ -456,7 +457,7 @@ function changeout(href, param, value) {
|
|
456
457
|
@#{obj_name}.attributes.each do |k, val| %>
|
457
458
|
<tr>
|
458
459
|
<%# %%% Accommodate composite keys %>
|
459
|
-
<% next if
|
460
|
+
<% next if #{pk}.include?(k) || ::Brick.config.metadata_columns.include?(k) %>
|
460
461
|
<th class=\"show-field\">
|
461
462
|
<% has_fields = true
|
462
463
|
if (bt = bts[k])
|
@@ -464,26 +465,31 @@ function changeout(href, param, value) {
|
|
464
465
|
bt_name = bt[1].map { |x| x.first.name }.join('/')
|
465
466
|
# %%% Only do this if the user has permissions to edit this bt field
|
466
467
|
if bt[2] # Polymorphic?
|
467
|
-
poly_class_name = @#{obj_name}.send(\"#\{bt.first\}_type\")
|
468
|
+
poly_class_name = orig_poly_name = @#{obj_name}.send(\"#\{bt.first\}_type\")
|
468
469
|
bt_pair = nil
|
469
470
|
loop do
|
470
471
|
bt_pair = bt[1].find { |pair| pair.first.name == poly_class_name }
|
471
472
|
# Acxommodate any valid STI by going up the chain of inheritance
|
472
473
|
break unless bt_pair.nil? && poly_class_name = ::Brick.existing_stis[poly_class_name]
|
473
474
|
end
|
475
|
+
puts \"*** Might be missing an STI class called #\{orig_poly_name\} whose base class should have this:
|
476
|
+
*** has_many :#{table_name}, as: :#\{bt.first\}
|
477
|
+
*** Can probably auto-configure everything using these lines in an initialiser:
|
478
|
+
*** Brick.sti_namespace_prefixes = { '::#\{orig_poly_name\}' => 'SomeParentModel' }
|
479
|
+
*** Brick.polymorphics = { '#{table_name}.#\{bt.first\}' => ['SomeParentModel'] }\" if bt_pair.nil?
|
474
480
|
# descrips = @_brick_bt_descrip[bt.first][bt_class]
|
475
481
|
poly_id = @#{obj_name}.send(\"#\{bt.first\}_id\")
|
476
482
|
# bt_class.order(obj_pk = bt_class.primary_key).each { |obj| option_detail << [obj.brick_descrip(nil, obj_pk), obj.send(obj_pk)] }
|
477
483
|
else # No polymorphism, so just get the first one
|
478
484
|
bt_pair = bt[1].first
|
479
485
|
end
|
480
|
-
bt_class = bt_pair
|
486
|
+
bt_class = bt_pair&.first
|
481
487
|
if bt.length < 4
|
482
488
|
bt << (option_detail = [[\"(No #\{bt_name\} chosen)\", '^^^brick_NULL^^^']])
|
483
489
|
# %%% Accommodate composite keys for obj.pk at the end here
|
484
|
-
bt_class
|
490
|
+
bt_class&.order(obj_pk = bt_class.primary_key)&.each { |obj| option_detail << [obj.brick_descrip(nil, obj_pk), obj.send(obj_pk)] }
|
485
491
|
end %>
|
486
|
-
BT <%= bt_class
|
492
|
+
BT <%= bt_class&.bt_link(bt.first) || orig_poly_name %>
|
487
493
|
<% else %>
|
488
494
|
<%= k %>
|
489
495
|
<% end %>
|
@@ -493,7 +499,7 @@ function changeout(href, param, value) {
|
|
493
499
|
html_options = { prompt: \"Select #\{bt_name\}\" }
|
494
500
|
html_options[:class] = 'dimmed' unless val %>
|
495
501
|
<%= f.select k.to_sym, bt[3], { value: val || '^^^brick_NULL^^^' }, html_options %>
|
496
|
-
<%= bt_obj = bt_class
|
502
|
+
<%= bt_obj = bt_class&.find_by(bt_pair[1] => val); link_to('⇛', send(\"#\{bt_class.base_class.name.underscore\}_path\".to_sym, bt_obj.send(bt_class.primary_key.to_sym)), { class: 'show-arrow' }) if bt_obj %>
|
497
503
|
<% else case #{model_name}.column_for_attribute(k).type
|
498
504
|
when :string, :text %>
|
499
505
|
<% if is_bcrypt?(val) # || .readonly? %>
|
data/lib/brick/join_array.rb
CHANGED
@@ -213,7 +213,7 @@ module Brick
|
|
213
213
|
puts "X3"
|
214
214
|
super(key, ::Brick::JoinArray.new.replace([current, value]))
|
215
215
|
when ::Brick::JoinArray # Concatenate new stuff onto any existing JoinArray
|
216
|
-
current.set_matching(value, nil)
|
216
|
+
current.set_matching(value, nil) if value
|
217
217
|
when ::Brick::JoinHash # Graduate an existing hash into being in an array if things are dissimilar
|
218
218
|
super(key, ::Brick::JoinArray.new.replace([current, value]))
|
219
219
|
value
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -325,9 +325,9 @@ module Brick
|
|
325
325
|
You might be missing an STI namespace prefix entry for these tables: #{missing_stis.keys.join(', ')}.
|
326
326
|
In config/initializers/brick.rb appropriate entries would look something like:
|
327
327
|
Brick.sti_namespace_prefixes = {"
|
328
|
-
puts missing_stis.map { |_k, missing_sti| "\n '::#{missing_sti}' => '
|
328
|
+
puts missing_stis.map { |_k, missing_sti| "\n '::#{missing_sti}' => 'SomeParentModel'" }.join(',')
|
329
329
|
puts " }
|
330
|
-
(Just trade out
|
330
|
+
(Just trade out SomeParentModel with some more appropriate one.)"
|
331
331
|
end
|
332
332
|
end
|
333
333
|
@_additional_references_loaded = true
|
@@ -451,7 +451,7 @@ ActiveSupport.on_load(:active_record) do
|
|
451
451
|
relation = clone # spawn
|
452
452
|
relation.select_values = column_names
|
453
453
|
result = if klass.connection.class.name.end_with?('::PostgreSQLAdapter')
|
454
|
-
rslt = klass.
|
454
|
+
rslt = klass.execute_sql(relation.arel.to_sql)
|
455
455
|
rslt.type_map =
|
456
456
|
@type_map ||= proc do
|
457
457
|
# This aliasing avoids the warning:
|
@@ -113,24 +113,24 @@ module Brick
|
|
113
113
|
# # #{resembles_fks.join(', ')}"
|
114
114
|
end
|
115
115
|
|
116
|
-
poly = case (possible_polymorphics = possible_polymorphics.values.flatten).length
|
116
|
+
poly = case (possible_polymorphics = possible_polymorphics.values.flatten.map { |poss_poly| "#{poss_poly} => nil"}).length
|
117
117
|
when 0
|
118
118
|
" like this:
|
119
|
-
# Brick.polymorphics =
|
120
|
-
# 'comments.commentable',
|
121
|
-
# 'images.imageable'
|
122
|
-
#
|
119
|
+
# Brick.polymorphics = {
|
120
|
+
# 'comments.commentable' => nil,
|
121
|
+
# 'images.imageable' => nil
|
122
|
+
# }"
|
123
123
|
when 1
|
124
124
|
".
|
125
125
|
# # Here is a possible polymorphic association that has been auto-identified for the #{ActiveRecord::Base.connection.current_database} database:
|
126
|
-
# Brick.polymorphics =
|
126
|
+
# Brick.polymorphics = { #{possible_additional_references.first} }"
|
127
127
|
|
128
128
|
else
|
129
129
|
".
|
130
130
|
# # Here are possible polymorphic associations that have been auto-identified for the #{ActiveRecord::Base.connection.current_database} database:
|
131
|
-
# Brick.polymorphics =
|
131
|
+
# Brick.polymorphics = {
|
132
132
|
# #{possible_polymorphics.join(",\n# ")}
|
133
|
-
#
|
133
|
+
# }"
|
134
134
|
end
|
135
135
|
|
136
136
|
create_file(filename, "# frozen_string_literal: true
|
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.
|
4
|
+
version: 1.0.28
|
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-
|
11
|
+
date: 2022-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|