forest_liana 9.12.1 → 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f3456439fa5952e7ed596a80b715612c094f75fd3435d543ce8bff33ab8faac
|
4
|
+
data.tar.gz: 28dd9cf312219f08bb4578320d4cb0062d7db96c836ec073f82b307d3185700a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1114f9ba4d54605af8a5e0e3c137ca2ad5c907205ead7788cb7c735895706029f030394e1ba944d657a155d6cce4165b1286bf7e8944bfa0f321b25923cebd2a
|
7
|
+
data.tar.gz: a20ca44cdba0d53db97669898a49f5b6ee76e9b778a10aee63852e2c042b7ae46bf46ac968911a7b42bb7d41d055276bb05230d68c6cc15cf90deb086c96ce1e
|
@@ -118,7 +118,9 @@ module ForestLiana
|
|
118
118
|
|
119
119
|
if ret[:href].blank?
|
120
120
|
begin
|
121
|
-
if @options[:include].try(:include?, attribute_name.to_s)
|
121
|
+
if @options[:include].try(:include?, attribute_name.to_s) &&
|
122
|
+
!SchemaHelper.is_smart_field?(object.class, attribute_name.to_s)
|
123
|
+
|
122
124
|
object.send(attribute_name)
|
123
125
|
end
|
124
126
|
|
@@ -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
|
data/lib/forest_liana/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2025-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|