brick 1.0.123 → 1.0.124
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 +19 -8
- data/lib/brick/frameworks/rails/form_tags.rb +13 -5
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +8 -3
- 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: 44fce70a53b4467d019ca42a9826f44a4849d472dcbfc2fe324f961708b70a18
|
4
|
+
data.tar.gz: 2674709f203786560b41c1bf1e2062336cf88282d168848303e9920b398662e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 337760a0382fd37a64026a07d80e708f9f475f73e8ca420d05341b731c977ab9153556803f10314a4851730e28a22ce4847705e2d8ad81121a8f33736f505f12
|
7
|
+
data.tar.gz: 04a1e5ec1cc503173da16be708d611f9fb1dd6f3965e6e848dfd1e310f3e1c94b396c8e693982d8f3c3589b5d8ffbfee70fd52593918e12ecd8309c8e110b4c5
|
data/lib/brick/extensions.rb
CHANGED
@@ -638,6 +638,7 @@ module ActiveRecord
|
|
638
638
|
# Add derived table JOIN for the has_many counts
|
639
639
|
nix = []
|
640
640
|
klass._br_hm_counts.each do |k, hm|
|
641
|
+
num_bt_things = 0
|
641
642
|
count_column = if hm.options[:through]
|
642
643
|
# Build the chain of JOINs going to the final destination HMT table
|
643
644
|
# (Usually just one JOIN, but could be many.)
|
@@ -668,6 +669,8 @@ module ActiveRecord
|
|
668
669
|
from_clause << if (src_ref = a.source_reflection).macro == :belongs_to
|
669
670
|
nm = hmt_assoc.source_reflection.inverse_of&.name
|
670
671
|
link_back << nm
|
672
|
+
num_bt_things += 1
|
673
|
+
# puts "BT #{a.table_name}"
|
671
674
|
"ON br_t#{idx}.id = br_t#{idx - 1}.#{a.foreign_key}"
|
672
675
|
elsif src_ref.options[:as]
|
673
676
|
"ON br_t#{idx}.#{src_ref.type} = '#{src_ref.active_record.name}'" + # "polymorphable_type"
|
@@ -686,6 +689,7 @@ module ActiveRecord
|
|
686
689
|
"br_t#{idx - 1}.#{a.foreign_key} = br_t#{idx}.id"
|
687
690
|
end
|
688
691
|
else # Standard has_many or has_one
|
692
|
+
# puts "HM #{a.table_name}"
|
689
693
|
# binding.pry unless (
|
690
694
|
nm = hmt_assoc.source_reflection.inverse_of&.name
|
691
695
|
# )
|
@@ -708,7 +712,13 @@ module ActiveRecord
|
|
708
712
|
# binding.pry if link_back.length > 2
|
709
713
|
"br_t#{idx}.#{hm.foreign_key}"
|
710
714
|
else # A HMT that goes HM -> HM, something like Categories -> Products -> LineItems
|
711
|
-
#
|
715
|
+
# %%% Currently flaky, so will revisit this soon, probably while implementing the whole link_back architecture
|
716
|
+
if num_bt_things > 1
|
717
|
+
# binding.pry
|
718
|
+
nix << k
|
719
|
+
next
|
720
|
+
end
|
721
|
+
|
712
722
|
"br_t#{idx}.#{src_ref.active_record.primary_key}"
|
713
723
|
end
|
714
724
|
else
|
@@ -2498,9 +2508,9 @@ module Brick
|
|
2498
2508
|
# rubocop:enable Style/CommentedKeyword
|
2499
2509
|
|
2500
2510
|
class << self
|
2501
|
-
def _add_bt_and_hm(fk, relations,
|
2511
|
+
def _add_bt_and_hm(fk, relations, polymorphic_class = nil, is_optional = false)
|
2502
2512
|
bt_assoc_name = ::Brick.namify(fk[2], :downcase)
|
2503
|
-
unless
|
2513
|
+
unless polymorphic_class
|
2504
2514
|
bt_assoc_name = if bt_assoc_name.underscore.end_with?('_id')
|
2505
2515
|
bt_assoc_name[-3] == '_' ? bt_assoc_name[0..-4] : bt_assoc_name[0..-3]
|
2506
2516
|
elsif bt_assoc_name.downcase.end_with?('id') && bt_assoc_name.exclude?('_')
|
@@ -2555,7 +2565,7 @@ module Brick
|
|
2555
2565
|
puts "Brick: Additional reference #{fk.inspect} refers to non-existent #{'table'.pluralize(missing.length)} #{missing.join(' and ')}. (Available tables include #{tables.join(', ')}.)"
|
2556
2566
|
return
|
2557
2567
|
end
|
2558
|
-
unless (cols = relations[fk[1]][:cols]).key?(fk[2]) || (
|
2568
|
+
unless (cols = relations[fk[1]][:cols]).key?(fk[2]) || (polymorphic_class && cols.key?("#{fk[2]}_id") && cols.key?("#{fk[2]}_type"))
|
2559
2569
|
columns = cols.map { |k, v| "#{k} (#{v.first.split(' ').first})" }
|
2560
2570
|
puts "Brick: Additional reference #{fk.inspect} refers to non-existent column #{fk[2]}. (Columns present in #{fk[1]} are #{columns.join(', ')}.)"
|
2561
2571
|
return
|
@@ -2572,9 +2582,10 @@ module Brick
|
|
2572
2582
|
return unless bts # Rails 5.0 and older can have bts end up being nil
|
2573
2583
|
|
2574
2584
|
if (assoc_bt = bts[cnstr_name])
|
2575
|
-
if
|
2585
|
+
if polymorphic_class
|
2576
2586
|
# Assuming same fk (don't yet support composite keys for polymorphics)
|
2577
2587
|
assoc_bt[:inverse_table] << fk[4]
|
2588
|
+
assoc_bt[:polymorphic] << polymorphic_class
|
2578
2589
|
else # Expect we could have a composite key going
|
2579
2590
|
if assoc_bt[:fk].is_a?(String)
|
2580
2591
|
assoc_bt[:fk] = [assoc_bt[:fk], fk[2]] unless fk[2] == assoc_bt[:fk]
|
@@ -2584,10 +2595,10 @@ module Brick
|
|
2584
2595
|
assoc_bt[:assoc_name] = "#{assoc_bt[:assoc_name]}_#{fk[2]}"
|
2585
2596
|
end
|
2586
2597
|
else
|
2587
|
-
inverse_table = [primary_table] if
|
2598
|
+
inverse_table = [primary_table] if polymorphic_class
|
2588
2599
|
assoc_bt = bts[cnstr_name] = { is_bt: true, fk: fk[2], assoc_name: bt_assoc_name, inverse_table: inverse_table || primary_table }
|
2589
2600
|
assoc_bt[:optional] = true if is_optional
|
2590
|
-
assoc_bt[:polymorphic] =
|
2601
|
+
assoc_bt[:polymorphic] = [polymorphic_class] if polymorphic_class
|
2591
2602
|
end
|
2592
2603
|
if is_class
|
2593
2604
|
# For use in finding the proper :source for a HMT association that references an STI subclass
|
@@ -2613,7 +2624,7 @@ module Brick
|
|
2613
2624
|
end
|
2614
2625
|
assoc_hm = hms[hm_cnstr_name] = { is_bt: false, fk: fk[2], assoc_name: fk_namified.pluralize, alternate_name: bt_assoc_name,
|
2615
2626
|
inverse_table: inv_tbl, inverse: assoc_bt }
|
2616
|
-
assoc_hm[:polymorphic] = true if
|
2627
|
+
assoc_hm[:polymorphic] = true if polymorphic_class
|
2617
2628
|
hm_counts = relation.fetch(:hm_counts) { relation[:hm_counts] = {} }
|
2618
2629
|
this_hm_count = hm_counts[fk[1]] = hm_counts.fetch(fk[1]) { 0 } + 1
|
2619
2630
|
end
|
@@ -170,11 +170,8 @@ module Brick::Rails::FormTags
|
|
170
170
|
if klass
|
171
171
|
type_col = klass.inheritance_column # Usually 'type'
|
172
172
|
filter_parts << "#{type_col}=#{sti_type}" if sti_type && klass.column_names.include?(type_col)
|
173
|
-
path_params = request.path_parameters
|
174
|
-
path_params.delete(:controller)
|
175
|
-
path_params.delete(:action)
|
173
|
+
path_params = request.path_parameters
|
176
174
|
pk = (klass.primary_key || ActiveRecord::Base.primary_key).to_sym
|
177
|
-
# Used to also have this but it's a bit too permissive to identify a primary key: (path_params.length == 1 && path_params.values.first) ||
|
178
175
|
if ((id = (path_params[pk] || path_params[:id] || path_params["#{klass.name.underscore}_id".to_sym])) && (obj = klass.find_by(pk => id))) ||
|
179
176
|
(['show', 'edit', 'update', 'destroy'].include?(action_name) && (obj = klass.first))
|
180
177
|
obj
|
@@ -183,7 +180,18 @@ module Brick::Rails::FormTags
|
|
183
180
|
# %%% If there is a polymorphic association that might relate to stuff in the path_params,
|
184
181
|
# try to identify an appropriate ___able_id and ___able_type filter
|
185
182
|
((klass.column_names - [pk.to_s]) & path_params.keys.map(&:to_s)).each do |path_param|
|
186
|
-
|
183
|
+
next if [:controller, :action].include?(path_param)
|
184
|
+
|
185
|
+
foreign_id = path_params[path_param.to_sym]
|
186
|
+
# Need to convert a friendly_id slug to a real ID?
|
187
|
+
if Object.const_defined?('FriendlyId') &&
|
188
|
+
(assoc = klass.reflect_on_all_associations.find { |a| a.belongs_to? && a.foreign_key == path_param }) &&
|
189
|
+
(assoc_klass = assoc.klass).instance_variable_get(:@friendly_id_config) &&
|
190
|
+
(new_id = assoc_klass.where(assoc_klass.friendly_id_config.query_field => foreign_id)
|
191
|
+
.pluck(assoc_klass.primary_key).first)
|
192
|
+
foreign_id = new_id
|
193
|
+
end
|
194
|
+
filter_parts << "#{path_param}=#{foreign_id}"
|
187
195
|
end
|
188
196
|
klass
|
189
197
|
end
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -208,7 +208,7 @@ module Brick
|
|
208
208
|
if a.polymorphic?
|
209
209
|
rel_poly_bt = relations[model.table_name][:fks].find { |_k, fk| fk[:assoc_name] == a.name.to_s }
|
210
210
|
if (primary_tables = rel_poly_bt&.last&.fetch(:inverse_table, [])).is_a?(Array)
|
211
|
-
models =
|
211
|
+
models = rel_poly_bt[1][:polymorphic]&.map { |table| table.singularize.camelize.constantize }
|
212
212
|
s.first[a.foreign_key.to_s] = [a.name, models, true]
|
213
213
|
else
|
214
214
|
# This will come up when using Devise invitable when invited_by_class_name is not
|
@@ -523,8 +523,13 @@ module Brick
|
|
523
523
|
table_name, poly = k.split('.')
|
524
524
|
v ||= ActiveRecord::Base.execute_sql("SELECT DISTINCT #{poly}_type AS typ FROM #{table_name}").each_with_object([]) { |result, s| s << result['typ'] if result['typ'] }
|
525
525
|
v.each do |type|
|
526
|
-
|
527
|
-
|
526
|
+
# Allow polymorphic BT to relate to an STI subclass
|
527
|
+
base_type = ::Brick.config.sti_namespace_prefixes["::#{type}"] ||
|
528
|
+
::Brick.config.sti_namespace_prefixes.find { |k, _v| type.start_with?(k[2..-1]) }&.last&.[](2..-1)
|
529
|
+
if relations.key?(primary_table = (base_type || type).underscore.pluralize)
|
530
|
+
::Brick._add_bt_and_hm([nil, table_name, poly, nil, primary_table, "(brick) #{table_name}_#{poly}"], relations,
|
531
|
+
type, # Polymorphic class
|
532
|
+
is_optional)
|
528
533
|
else
|
529
534
|
missing_stis[primary_table] = type unless ::Brick.existing_stis.key?(type)
|
530
535
|
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.
|
4
|
+
version: 1.0.124
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
11
|
+
date: 2023-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|