brick 1.0.208 → 1.0.210
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/brick/extensions.rb +60 -46
- data/lib/brick/frameworks/rails/form_builder.rb +1 -1
- data/lib/brick/frameworks/rails/form_tags.rb +9 -9
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +7 -7
- 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: 803d4790408a0b789ff8086b5b81346581071b260cbc528039fd8cfa8894b7ac
|
4
|
+
data.tar.gz: 4503e1b9feba62d33e83f3fadc25a34b70bf9c661dc750187a3c391e3b24d5e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fe28c2a9ca30ef663f28fe79e65e1b2787686c6fce6d5738d9b6addd6070437411d5210e1ba641b28eae5215fb37756f3faa80f246d823d5d553c9db990a427
|
7
|
+
data.tar.gz: daa9bb88c21467075717062c1ede0ab38af4207bf96d9a2495ce84f99850a4d0cb09f4c1c95017cb3862ef915fab85036397375d43518f7bee2d7bd6f1255aed
|
data/lib/brick/extensions.rb
CHANGED
@@ -72,7 +72,7 @@ module ActiveRecord
|
|
72
72
|
|
73
73
|
def real_model(params)
|
74
74
|
if params && (sub_model = params.fetch(type_col = inheritance_column, nil))
|
75
|
-
sub_model = sub_model.first if sub_model.is_a?(Array) # Support the params style that gets returned from #
|
75
|
+
sub_model = sub_model.first if sub_model.is_a?(Array) # Support the params style that gets returned from #_brick_querying
|
76
76
|
# Make sure the chosen model is really the same or a subclass of this model
|
77
77
|
(possible_model = sub_model.constantize) <= self ? possible_model : self
|
78
78
|
else
|
@@ -491,17 +491,12 @@ module ActiveRecord
|
|
491
491
|
[order_by, order_by_txt]
|
492
492
|
end
|
493
493
|
|
494
|
-
def self.brick_select(*args,
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
args
|
501
|
-
end
|
502
|
-
(relation = all).brick_select(selects, *other_args,
|
503
|
-
params: params, brick_col_names: brick_col_names, **kwargs)
|
504
|
-
relation.select(selects)
|
494
|
+
def self.brick_select(*args, **kwargs)
|
495
|
+
all.brick_select(*args, **kwargs)
|
496
|
+
end
|
497
|
+
|
498
|
+
def self.brick_pluck(*args, withhold_ids: true, **kwargs)
|
499
|
+
all.brick_pluck(*args, withhold_ids: withhold_ids, **kwargs)
|
505
500
|
end
|
506
501
|
|
507
502
|
def self.brick_where(*args)
|
@@ -542,33 +537,47 @@ module ActiveRecord
|
|
542
537
|
|
543
538
|
# Links from ActiveRecord association pathing names over to the real table
|
544
539
|
# correlation names that get chosen when the AREL AST tree is walked.
|
545
|
-
def brick_links
|
540
|
+
def brick_links(do_dup = true)
|
546
541
|
# Touching AREL AST walks the JoinDependency tree, and in that process uses our
|
547
542
|
# "brick_links" patch to find how every AR chain of association names relates to exact
|
548
|
-
# table correlation names chosen by AREL.
|
549
|
-
#
|
550
|
-
#
|
551
|
-
#
|
552
|
-
#
|
553
|
-
#
|
554
|
-
#
|
555
|
-
# table
|
556
|
-
#
|
543
|
+
# table correlation names chosen by AREL. Unless a relation has already had its AST
|
544
|
+
# tree built out, we will use a duplicate relation object for this, because an important
|
545
|
+
# side-effect of referencing the AST is that the @arel instance variable gets set. This
|
546
|
+
# is a signal to ActiveRecord that a relation has now become immutable. (When Brick is
|
547
|
+
# still in the middle of calculating its query, we aren't quite ready for the relation
|
548
|
+
# object to be set in stone ... still need to add .select(), and possibly .where() and
|
549
|
+
# .order() things ... also if there are any HM counts then an OUTER JOIN for each of
|
550
|
+
# them out to a derived table to do that counting. All of these things need to know
|
551
|
+
# proper table correlation names, which will now become available from brick_links on
|
552
|
+
# the rel_dupe object.)
|
557
553
|
@_brick_links ||= begin
|
558
554
|
# If it's a CollectionProxy (which inherits from Relation) then need to dig
|
559
555
|
# out the core Relation object which is found in the association scope.
|
560
|
-
|
556
|
+
brick_rel = is_a?(ActiveRecord::Associations::CollectionProxy) ? scope : self
|
557
|
+
brick_rel = (@_brick_rel_dup ||= brick_rel.dup) if do_dup
|
561
558
|
# Start out with a hash that has only the root table name
|
562
|
-
|
563
|
-
|
559
|
+
brick_rel.instance_variable_set(:@_brick_links, bl = { '' => table_name })
|
560
|
+
brick_rel.arel.ast if do_dup # Walk the AST tree in order to capture all the other correlation names
|
564
561
|
bl
|
565
562
|
end
|
566
563
|
end
|
567
564
|
|
568
|
-
def brick_select(*args,
|
569
|
-
|
570
|
-
|
571
|
-
|
565
|
+
def brick_select(*args, **kwargs)
|
566
|
+
selects = args[0].is_a?(Array) ? args[0] : args
|
567
|
+
_brick_querying(selects, **kwargs)
|
568
|
+
select(selects)
|
569
|
+
end
|
570
|
+
|
571
|
+
def brick_pluck(*args, withhold_ids: true, **kwargs)
|
572
|
+
selects = args[0].is_a?(Array) ? args[0] : args
|
573
|
+
_brick_querying(selects, withhold_ids: withhold_ids, **kwargs)
|
574
|
+
pluck(selects)
|
575
|
+
end
|
576
|
+
|
577
|
+
def _brick_querying(*args, withhold_ids: nil, params: {}, order_by: nil, translations: {},
|
578
|
+
join_array: ::Brick::JoinArray.new,
|
579
|
+
cust_col_override: nil,
|
580
|
+
brick_col_names: nil)
|
572
581
|
selects = args[0].is_a?(Array) ? args[0] : args
|
573
582
|
if selects.present? && cust_col_override.nil? # See if there's any fancy ones in the select list
|
574
583
|
idx = 0
|
@@ -652,13 +661,13 @@ module ActiveRecord
|
|
652
661
|
"'<#{typ.end_with?('_TYP') ? typ[0..-5] : typ}>' AS #{col.name}"
|
653
662
|
end
|
654
663
|
end
|
655
|
-
|
664
|
+
elsif !withhold_ids # Having some select columns chosen, add any missing always_load_fields for this model ...
|
656
665
|
this_model = klass
|
657
666
|
loop do
|
658
667
|
::Brick.config.always_load_fields.fetch(this_model.name, nil)&.each do |alf|
|
659
668
|
selects << alf unless selects.include?(alf)
|
660
669
|
end
|
661
|
-
# ... plus any and all STI superclasses it may inherit from
|
670
|
+
# ... plus ALF fields from any and all STI superclasses it may inherit from
|
662
671
|
break if (this_model = this_model.superclass).abstract_class? || this_model == ActiveRecord::Base
|
663
672
|
end
|
664
673
|
end
|
@@ -671,15 +680,16 @@ module ActiveRecord
|
|
671
680
|
end
|
672
681
|
end
|
673
682
|
|
674
|
-
core_selects = selects.dup
|
683
|
+
# core_selects = selects.dup
|
675
684
|
id_for_tables = Hash.new { |h, k| h[k] = [] }
|
676
685
|
field_tbl_names = Hash.new { |h, k| h[k] = {} }
|
677
686
|
used_col_aliases = {} # Used to make sure there is not a name clash
|
678
687
|
|
679
688
|
# CUSTOM COLUMNS
|
680
689
|
# ==============
|
681
|
-
(cust_col_override || klass._br_cust_cols)
|
682
|
-
|
690
|
+
(cust_col_override || (!withhold_ids && klass._br_cust_cols))&.each do |k, cc|
|
691
|
+
brick_links # Intentionally create a relation duplicate
|
692
|
+
if @_brick_rel_dup.respond_to?(k) # Name already taken?
|
683
693
|
# %%% Use ensure_unique here in this kind of fashion:
|
684
694
|
# cnstr_name = ensure_unique(+"(brick) #{for_tbl}_#{pri_tbl}", nil, bts, hms)
|
685
695
|
# binding.pry
|
@@ -728,12 +738,14 @@ module ActiveRecord
|
|
728
738
|
selects << "#{_br_quoted_name(tbl_name)}.#{_br_quoted_name(cc_part.last)} AS #{_br_quoted_name(col_alias)}"
|
729
739
|
cc_part << col_alias
|
730
740
|
end
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
741
|
+
unless withhold_ids
|
742
|
+
# Add a key column unless we've already got it
|
743
|
+
if key_alias && !used_col_aliases.key?(key_alias)
|
744
|
+
selects << "#{_br_quoted_name(key_tbl_name)}.#{_br_quoted_name(dest_pk)} AS #{_br_quoted_name(key_alias)}"
|
745
|
+
used_col_aliases[key_alias] = nil
|
746
|
+
end
|
747
|
+
cc[2] = key_alias ? [key_klass, key_alias] : nil
|
735
748
|
end
|
736
|
-
cc[2] = key_alias ? [key_klass, key_alias] : nil
|
737
749
|
end
|
738
750
|
|
739
751
|
# LEFT OUTER JOINs
|
@@ -749,7 +761,7 @@ module ActiveRecord
|
|
749
761
|
# %%% Strangely in Rails 7.1 on a slower system then very rarely brick_link comes back nil...
|
750
762
|
brick_link = brick_links[sel_col.first]
|
751
763
|
field_tbl_name = brick_link&.split('.')&.last ||
|
752
|
-
# ... so here's a best-effort guess
|
764
|
+
# ... so if it is nil then here's a best-effort guess as to what the table name might be.
|
753
765
|
klass.reflect_on_association(sel_col.first)&.klass&.table_name
|
754
766
|
# If it's Oracle, quote any AREL aliases that had been applied
|
755
767
|
field_tbl_name = "\"#{field_tbl_name}\"" if ::Brick.is_oracle && brick_links.values.include?(field_tbl_name)
|
@@ -1020,9 +1032,10 @@ JOIN (SELECT #{hm_selects.map { |s| _br_quoted_name("#{'br_t0.' if from_clause}#
|
|
1020
1032
|
selects << 'customer_id' if klass.name == 'Pay::Subscription' && Pay::Subscription.columns_hash.key?('customer_id')
|
1021
1033
|
|
1022
1034
|
pieces, my_dsl = klass.brick_parse_dsl(join_array = ::Brick::JoinArray.new, [], translations = {}, false, nil, true)
|
1023
|
-
|
1035
|
+
_brick_querying(
|
1024
1036
|
selects, where_values_hash, nil, translations: translations, join_array: join_array,
|
1025
|
-
cust_col_override: { '_br' => (descrip_cols = [pieces, my_dsl]) }
|
1037
|
+
cust_col_override: { '_br' => (descrip_cols = [pieces, my_dsl]) },
|
1038
|
+
brick_col_names: true
|
1026
1039
|
)
|
1027
1040
|
order_values = "#{_br_quoted_name(klass.table_name)}.#{_br_quoted_name(klass.primary_key)}"
|
1028
1041
|
[self.select(selects), descrip_cols]
|
@@ -2244,9 +2257,10 @@ class Object
|
|
2244
2257
|
|
2245
2258
|
ar_relation = ActiveRecord.version < Gem::Version.new('4') ? real_model.preload : real_model.all
|
2246
2259
|
params['_brick_is_api'] = true if (is_api = request.format == :js || current_api_root)
|
2247
|
-
@_brick_params = ar_relation.
|
2248
|
-
|
2249
|
-
|
2260
|
+
@_brick_params = ar_relation._brick_querying((selects ||= []), params: params, order_by: order_by,
|
2261
|
+
translations: (translations = {}),
|
2262
|
+
join_array: (join_array = ::Brick::JoinArray.new),
|
2263
|
+
brick_col_names: true)
|
2250
2264
|
|
2251
2265
|
if is_api # Asking for JSON?
|
2252
2266
|
# Apply column renaming
|
@@ -2340,7 +2354,7 @@ class Object
|
|
2340
2354
|
_, order_by_txt = model._brick_calculate_ordering(default_ordering(table_name, pk, true)) if pk
|
2341
2355
|
code << " def index\n"
|
2342
2356
|
code << " @#{plural_table_name} = #{model.name}#{pk&.present? ? ".order(#{order_by_txt.join(', ')})" : '.all'}\n"
|
2343
|
-
code << " @#{plural_table_name}.
|
2357
|
+
code << " @#{plural_table_name}._brick_querying(params, brick_col_names: true)\n"
|
2344
2358
|
code << " end\n"
|
2345
2359
|
|
2346
2360
|
is_pk_string = nil
|
@@ -57,7 +57,7 @@ module Brick::Rails::FormBuilder
|
|
57
57
|
out << ::Brick::Rails.hide_bcrypt(val, nil, 1000)
|
58
58
|
elsif col_type == :string
|
59
59
|
if model.respond_to?(:uploaders) && model.uploaders.key?(col.name&.to_sym) &&
|
60
|
-
|
60
|
+
(url = self.object.send(col.name)&.url) # Carrierwave image?
|
61
61
|
out << "<img src=\"#{url}\" title=\"#{val}\">"
|
62
62
|
elsif model.respond_to?(:enumerized_attributes) && (opts = (attr = model.enumerized_attributes[method])&.options).present?
|
63
63
|
enum_html_options = attr.kind_of?(Enumerize::Multiple) ? html_options.merge({ multiple: true, size: opts.length + 1 }) : html_options
|
@@ -232,15 +232,15 @@ module Brick::Rails::FormTags
|
|
232
232
|
out << if klass._brick_monetized_attributes&.include?(col_name)
|
233
233
|
val ? Money.new(val.to_i).format : ''
|
234
234
|
elsif klass.respond_to?(:uploaders) && klass.uploaders.key?(col_name.to_sym) &&
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
235
|
+
(url = obj.send(col.name)&.url) && # Has a Carrierwave URL? ...
|
236
|
+
# ... and either not restricting Carrierwave, or under the defined Carrierwave attachment limit?
|
237
|
+
(!(limit_carrierwave = ::Brick.config.limit_carrierwave) ||
|
238
|
+
(limit_carrierwave.is_a?(Numeric) &&
|
239
|
+
(carrierwave_count = instance_variable_get(:@_carrierwave_count) || 0) &&
|
240
|
+
((carrierwave_count += 1) < limit_carrierwave) &&
|
241
|
+
instance_variable_set(:@_carrierwave_count, carrierwave_count)
|
242
|
+
)
|
243
|
+
)
|
244
244
|
"<img class=\"thumbImg\" src=\"#{url}\" title=\"#{val}\">"
|
245
245
|
else
|
246
246
|
lat_lng = if [:float, :decimal].include?(col.type) &&
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -1512,7 +1512,7 @@ module ActiveRecord
|
|
1512
1512
|
module QueryMethods
|
1513
1513
|
private
|
1514
1514
|
|
1515
|
-
if private_instance_methods.include?(:build_join_query)
|
1515
|
+
if private_instance_methods.include?(:build_join_query) # AR 5.0 - 6.0
|
1516
1516
|
alias _brick_build_join_query build_join_query
|
1517
1517
|
def build_join_query(manager, buckets, *args) # , **kwargs)
|
1518
1518
|
# %%% Better way to bring relation into the mix
|
@@ -1523,7 +1523,7 @@ module ActiveRecord
|
|
1523
1523
|
_brick_build_join_query(manager, buckets, *args) # , **kwargs)
|
1524
1524
|
end
|
1525
1525
|
|
1526
|
-
elsif private_instance_methods.include?(:select_association_list)
|
1526
|
+
elsif private_instance_methods.include?(:select_association_list) # AR >= 6.1
|
1527
1527
|
alias _brick_select_association_list select_association_list
|
1528
1528
|
def select_association_list(associations, stashed_joins = nil)
|
1529
1529
|
result = _brick_select_association_list(associations, stashed_joins)
|
@@ -1531,7 +1531,7 @@ module ActiveRecord
|
|
1531
1531
|
result
|
1532
1532
|
end
|
1533
1533
|
|
1534
|
-
# else #
|
1534
|
+
# else # AR 4.2 and older
|
1535
1535
|
# alias _brick_build_joins build_joins
|
1536
1536
|
# def build_joins(manager, joins)
|
1537
1537
|
# result = _brick_build_joins(manager, joins)
|
@@ -1551,12 +1551,12 @@ module ActiveRecord
|
|
1551
1551
|
# Capture the table alias name that was chosen
|
1552
1552
|
# if (relation = node.instance_variable_get(:@assocs)&.instance_variable_get(:@relation))
|
1553
1553
|
# link_path = node.instance_variable_get(:@link_path)
|
1554
|
-
# relation.brick_links[link_path] = result.first.table_alias || result.first.table_name
|
1554
|
+
# relation.brick_links(false)[link_path] = result.first.table_alias || result.first.table_name
|
1555
1555
|
# end
|
1556
1556
|
result
|
1557
1557
|
end
|
1558
1558
|
end
|
1559
|
-
else # For AR >= 4.
|
1559
|
+
else # For AR >= 4.1
|
1560
1560
|
class JoinDependency
|
1561
1561
|
# An intelligent .eager_load() and .includes() that creates t0_r0 style aliases only for the columns
|
1562
1562
|
# used in .select(). To enable this behaviour, include the flag :_brick_eager_load as the first
|
@@ -1652,7 +1652,7 @@ module ActiveRecord
|
|
1652
1652
|
# Capture the table alias name that was chosen
|
1653
1653
|
if (relation = node.instance_variable_get(:@assocs)&.instance_variable_get(:@relation))
|
1654
1654
|
link_path = node.instance_variable_get(:@link_path)
|
1655
|
-
relation.brick_links[link_path] = result.first.table_alias || result.first.table_name
|
1655
|
+
relation.brick_links(false)[link_path] = result.first.table_alias || result.first.table_name
|
1656
1656
|
end
|
1657
1657
|
result
|
1658
1658
|
end
|
@@ -1663,7 +1663,7 @@ module ActiveRecord
|
|
1663
1663
|
# Capture the table alias name that was chosen
|
1664
1664
|
if (relation = child.instance_variable_get(:@assocs)&.instance_variable_get(:@relation))
|
1665
1665
|
link_path = child.instance_variable_get(:@link_path)
|
1666
|
-
relation.brick_links[link_path] = if child.table.is_a?(Arel::Nodes::TableAlias)
|
1666
|
+
relation.brick_links(false)[link_path] = if child.table.is_a?(Arel::Nodes::TableAlias)
|
1667
1667
|
child.table.right
|
1668
1668
|
else
|
1669
1669
|
# Was: result.first&.left&.table_alias || child.table_name
|
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.210
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|