forest_liana 9.12.2 → 9.13.0

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: 758e323d04ac55ca40f00c3d77ccff83f2b12609ee13d82e9dba8bc785b8ed98
4
- data.tar.gz: 5cd38330c38e58fa252d160d52cdf0635116f75bb99112886991380bf35ea72c
3
+ metadata.gz: 5f3456439fa5952e7ed596a80b715612c094f75fd3435d543ce8bff33ab8faac
4
+ data.tar.gz: 28dd9cf312219f08bb4578320d4cb0062d7db96c836ec073f82b307d3185700a
5
5
  SHA512:
6
- metadata.gz: 7289eb530fb56e1c0f1a70c25b61c3ed92d69fbc34fc437e730e7ece1a63e973f84b257fbb26543e9dd18405890e00dc5c6365efcccbc742e644c560fee07ef1
7
- data.tar.gz: fb211dc081537bb5d8a8900867cc5264c74829b0a83e31f0a378d270f3b2dd0c73c5f05e3088da1919922517951ee274b9c67a6f422fe312d6e2dcdc6799e788
6
+ metadata.gz: 1114f9ba4d54605af8a5e0e3c137ca2ad5c907205ead7788cb7c735895706029f030394e1ba944d657a155d6cce4165b1286bf7e8944bfa0f321b25923cebd2a
7
+ data.tar.gz: a20ca44cdba0d53db97669898a49f5b6ee76e9b778a10aee63852e2c042b7ae46bf46ac968911a7b42bb7d41d055276bb05230d68c6cc15cf90deb086c96ce1e
@@ -21,11 +21,11 @@ module ForestLiana
21
21
  @includes = ForestLiana::QueryHelper.get_one_association_names_symbol(@resource)
22
22
  end
23
23
 
24
- def optimize_record_loading(resource, records)
24
+ def optimize_record_loading(resource, records, force_preload = true)
25
25
  polymorphic, preload_loads = analyze_associations(resource)
26
26
  result = records.eager_load(@includes.uniq - preload_loads - polymorphic)
27
27
 
28
- result = result.preload(preload_loads) if Rails::VERSION::MAJOR >= 7
28
+ result = result.preload(preload_loads) if Rails::VERSION::MAJOR >= 7 && force_preload
29
29
 
30
30
  result
31
31
  end
@@ -37,10 +37,10 @@ module ForestLiana
37
37
  end
38
38
 
39
39
  if includes.empty? || has_smart_fields
40
- @records = optimize_record_loading(@resource, @records)
40
+ @records = optimize_record_loading(@resource, @records, false)
41
41
  else
42
42
  select = compute_select_fields
43
- @records = optimize_record_loading(@resource, @records).references(includes).select(*select)
43
+ @records = optimize_record_loading(@resource, @records, false).references(includes).select(*select)
44
44
  end
45
45
 
46
46
  @records
@@ -55,7 +55,79 @@ module ForestLiana
55
55
  end
56
56
 
57
57
  def records
58
- @records.offset(offset).limit(limit).to_a
58
+ records = @records.offset(offset).limit(limit).to_a
59
+
60
+ polymorphic_association, preload_loads = analyze_associations(@resource)
61
+ if polymorphic_association && Rails::VERSION::MAJOR >= 7
62
+ # TODO
63
+ end
64
+
65
+ preload_cross_database_associations(records, preload_loads)
66
+
67
+ records
68
+ end
69
+
70
+ def preload_cross_database_associations(records, preload_loads)
71
+ preload_loads.each do |association_name|
72
+ association = @resource.reflect_on_association(association_name)
73
+ next unless separate_database?(@resource, association)
74
+
75
+ columns = columns_for_cross_database_association(association_name)
76
+
77
+ if association.macro == :belongs_to
78
+ foreign_key = association.foreign_key
79
+ primary_key = association.klass.primary_key
80
+
81
+ ids = records.map { |r| r.public_send(foreign_key) }.compact.uniq
82
+ next if ids.empty?
83
+
84
+ associated = association.klass.where(primary_key => ids)
85
+ .select(columns)
86
+ .index_by { |record| record.public_send(primary_key) }
87
+
88
+ records.each do |record|
89
+ record.define_singleton_method(association_name) do
90
+ associated[record.send(foreign_key.to_sym)] || nil
91
+ end
92
+ end
93
+ end
94
+
95
+ if association.macro == :has_one
96
+ foreign_key = association.foreign_key
97
+ primary_key = association.active_record_primary_key
98
+
99
+ ids = records.map { |r| r.public_send(primary_key) }.compact.uniq
100
+ next if ids.empty?
101
+
102
+ associated = association.klass.where(foreign_key => ids)
103
+ .select(columns)
104
+ .index_by { |record| record.public_send(foreign_key.to_sym) }
105
+
106
+ records.each do |record|
107
+ record.define_singleton_method(association_name) do
108
+ associated[record.send(primary_key.to_sym)] || nil
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ def columns_for_cross_database_association(association_name)
116
+ return [:id] unless @params[:fields].present?
117
+
118
+ fields = @params[:fields][association_name.to_s]
119
+ return [:id] unless fields
120
+
121
+ base_fields = fields.split(',').map(&:strip).map(&:to_sym) | [:id]
122
+
123
+ association = @resource.reflect_on_association(association_name)
124
+ extra_key = association.foreign_key
125
+
126
+ # Add the foreign key used for the association to ensure it's available in the preloaded records
127
+ # This is necessary for has_one associations, without it calling record.public_send(foreign_key) would raise a "missing attribute" error
128
+ base_fields << extra_key if association.macro == :has_one
129
+
130
+ base_fields.uniq
59
131
  end
60
132
 
61
133
  def compute_includes
@@ -1,3 +1,3 @@
1
1
  module ForestLiana
2
- VERSION = "9.12.2"
2
+ VERSION = "9.13.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_liana
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.12.2
4
+ version: 9.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-15 00:00:00.000000000 Z
11
+ date: 2025-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails