rails_json_serializer 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc8a9ac788966e52d712b4927d9ec959015aeec7c401ed04741d34faeb315786
4
- data.tar.gz: 2ef1b797adfa346886d437cd8b5322418ddd96d1f06f1bf80d68bf59f9d589e6
3
+ metadata.gz: dd9c2225a4d011180d3faec0e67fc4969af7aec11c16221fa02f4a5115f83e7a
4
+ data.tar.gz: 942a32755c097539a0a777f958aaba7b053c31f615db0f6bda6ddb41a1ab8fdb
5
5
  SHA512:
6
- metadata.gz: 66ee9df244dd1e8317aab9013fe4ae6dc83dd77963660c8700e268f70bcb795b907299b88a1b5b1b7259ff663b5200122eda6a75d2a6d78763b6530e87ffb285
7
- data.tar.gz: 5923bb6172eb2a3bd8306035517cee75c975bbc6f2e4fa49922ccf206ef7042115377365f30887550a89f2e55905bc5623aa04975dd98daebcf681161d03d881
6
+ metadata.gz: cda83139a44087c474c4b64500586227558b39483e747f6903ed8551f9e92d786641a5ca14c726819291579be6334e6db1800a1a89f5c3c45cdbcd94d2466aa5
7
+ data.tar.gz: 6b809793573a8749e3ac44c0240a0dbda9bcd0ef4cd3e7516ccd30d3952ea76d472689bf7cfcc9ded2dfb15dd37c49c0a59bd980d6be236611484c56138b001b
@@ -1,8 +1,6 @@
1
- require 'active_support/concern'
2
- require_relative 'serializer/application_serializer'
1
+ require_relative 'serializer/model_serializer'
3
2
  Dir[File.join(Rails.root, 'app', 'serializers', '**', '*.rb')].each {|file| require file }
4
3
  require_relative 'serializer/configuration'
5
- require_relative 'serializer/concern'
6
4
 
7
5
  module Serializer
8
6
  # config src: http://lizabinante.com/blog/creating-a-configurable-ruby-gem/
@@ -24,4 +22,4 @@ module Serializer
24
22
  end
25
23
 
26
24
  # include the extension
27
- ActiveRecord::Base.send(:include, Serializer::Concern)
25
+ # ActiveRecord::Base.send(:include, Serializer::Concern)
@@ -0,0 +1,188 @@
1
+ module ModelSerializer
2
+ # klazz is that class object that included this module
3
+ def self.included klass
4
+ # START CLASS EVAL
5
+ klass.class_eval do
6
+ if self.const_defined?("#{klass.name}Serializer")
7
+ serializer_klass = "#{klass.name}Serializer".constantize
8
+ serializer_query_names = serializer_klass.public_instance_methods
9
+ if klass.superclass.const_defined?("SERIALIZER_QUERY_KEYS_CACHE")
10
+ self.const_set('SERIALIZER_QUERY_KEYS_CACHE', (serializer_query_names + klass.superclass::SERIALIZER_QUERY_KEYS_CACHE).uniq)
11
+ else
12
+ self.const_set('SERIALIZER_QUERY_KEYS_CACHE', serializer_query_names)
13
+ end
14
+ # Inject class methods, will have access to those queries on the class.
15
+ klass.send(:extend, serializer_klass)
16
+
17
+ # no need to define it if inheriting class has defined it OR has been manually overridden.
18
+ # CLASS METHODS
19
+ klass.send(:define_singleton_method, :serializer) do |opts = {}|
20
+ query = opts[:json_query_override].present? ? self.send(opts[:json_query_override], opts) : serializer_query(opts)
21
+ if Serializer.configuration.enable_includes && query[:include].present? && !opts[:skip_eager_loading]
22
+ includes(generate_includes_from_json_query(query)).as_json(query)
23
+ else
24
+ # Have to use 'all' gets stack level too deep otherwise. Not sure why.
25
+ all.as_json(query)
26
+ end
27
+ end
28
+
29
+ klass.send(:define_singleton_method, :generate_includes_from_json_query) do |options = {}, klass = nil|
30
+ query_filter = {}
31
+ klass = self if klass.nil?
32
+ if options[:include].present? && !options[:skip_eager_loading]
33
+ options[:include].each do |include_key, include_hash|
34
+ next if include_hash[:skip_eager_loading] == true
35
+ # Will 'next' if there is a scope that takes arguments, an instance-dependent scope.
36
+ # Can't eager load when assocation has a instance condition for it's associative scope.
37
+ # Might not be a real assocation
38
+ next if klass.reflect_on_association(include_key).nil?
39
+ next if klass.reflect_on_association(include_key).scope&.arity&.nonzero?
40
+ query_filter[include_key] = {}
41
+ next if include_hash.none?
42
+ query_filter[include_key] = generate_includes_from_json_query(include_hash, klass.reflect_on_association(include_key).klass)
43
+ end
44
+ end
45
+ # Does not include data, just eager-loads. Useful when methods need assocations, but you don't need association data.
46
+ if options[:eager_include].present?
47
+ options[:eager_include].each do |include_key|
48
+ # Will 'next' if there is a scope that takes arguments, an instance-dependent scope.
49
+ # Can't eager load when assocation has a instance condition for it's associative scope.
50
+ # Might not be a real assocation
51
+ next if klass.reflect_on_association(include_key).nil?
52
+ next if klass.reflect_on_association(include_key).scope&.arity&.nonzero?
53
+ query_filter[include_key] ||= {}
54
+ end
55
+ end
56
+ return query_filter
57
+ end
58
+
59
+ klass.send(:define_singleton_method, :as_json_associations_alias_fix) do |options, data, opts = {}|
60
+ if data
61
+ # Depth is almost purely for debugging purposes
62
+ opts[:depth] ||= 0
63
+ if options[:include].present?
64
+ options[:include].each do |include_key, include_hash|
65
+ # The includes doesn't have to have a hash attached. Skip it if it doesn't.
66
+ next if include_hash.nil?
67
+ data_key = include_key.to_s
68
+ if include_hash[:as].present?
69
+ if include_hash[:as].to_s == include_key.to_s
70
+ raise "Serializer: Cannot alias json query association to have the same as the original key; as: #{include_hash[:as].to_s}; original_key: #{include_key.to_s} on self: #{name}"
71
+ end
72
+ alias_name = include_hash[:as]
73
+ data[alias_name.to_s] = data[include_key.to_s]
74
+ data.delete(include_key.to_s)
75
+ data_key = alias_name.to_s
76
+ end
77
+ # At this point, the data could be an array of objects, with no as_json options.
78
+ if !data[data_key].is_a?(Array)
79
+ data[data_key] = as_json_associations_alias_fix(include_hash, data[data_key], {depth: opts[:depth] + 1})
80
+ else
81
+ data[data_key].each_with_index do |value,i|
82
+ data[data_key][i] = as_json_associations_alias_fix(include_hash, value, {depth: opts[:depth] + 1})
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ return data
89
+ end
90
+
91
+ # no need to define it if inheriting class has defined it OR has been manually overridden.
92
+ # INSTANCE Methods
93
+
94
+
95
+ klass.send(:define_method, :as_json) do |options = {}|
96
+ # Not caching records that don't have IDs.
97
+ if !Serializer.configuration.disable_model_caching && self.id && options[:cache_key].present? && !(options.key?(:cache_for) && options[:cache_for].nil?)
98
+ cache_key = "#{self.class.name}_____#{options[:cache_key]}___#{self.id}"
99
+ if Rails.cache.exist?(cache_key)
100
+ Rails.logger.info "Serializer: Cache reading #{cache_key}" if Serializer.configuration.debug
101
+ return Rails.cache.read(cache_key)
102
+ else
103
+ data = super(options)
104
+ data = self.class.as_json_associations_alias_fix(options, data)
105
+ begin
106
+ Rails.logger.info "Serializer: Caching #{cache_key} for #{(options[:cache_for] || Serializer.configuration.default_cache_time)} minutes." if Serializer.configuration.debug
107
+ Rails.cache.write(cache_key, data, expires_in: (options[:cache_for] || Serializer.configuration.default_cache_time).minute)
108
+ rescue Exception => e
109
+ Rails.logger.error "Serializer: Internal Server Error on #{self.class}#as_json ID: #{self.id} for cache key: #{cache_key}"
110
+ Rails.logger.error e.class
111
+ Rails.logger.error e.message
112
+ Rails.logger.error e.backtrace
113
+ end
114
+ return data
115
+ end
116
+ else
117
+ if Serializer.configuration.debug && !Serializer.configuration.disable_model_caching && self.id && options[:cache_key].present? && options.key?(:cache_for) && options[:cache_for].nil?
118
+ Rails.logger.info "Serializer: Caching #{cache_key} NOT caching due to `cache_for: nil`"
119
+ end
120
+ data = super(options)
121
+ data = self.class.as_json_associations_alias_fix(options, data)
122
+ return data
123
+ end
124
+ end
125
+
126
+ if !klass.method_defined?(:serializer)
127
+ klass.send(:define_method, :serializer) do |opts = {}|
128
+ query = opts[:json_query_override].present? ? self.class.send(opts[:json_query_override], opts) : self.class.serializer_query(opts)
129
+ if Serializer.configuration.enable_includes && query[:include].present? && self.class.column_names.include?('id') && self.id.present? && !opts[:skip_eager_loading] && self.respond_to?(:persisted?) && self.persisted?
130
+ # It's an extra SQL call, but most likely worth it to pre-load associations
131
+ self.class.includes(self.class.generate_includes_from_json_query(query)).find(self.id).as_json(query)
132
+ else
133
+ as_json(query)
134
+ end
135
+ end
136
+ end
137
+
138
+ # # SHOULD NOT BE OVERRIDDEN.
139
+ klass.send(:define_method, :clear_serializer_cache) do
140
+ if self.class.const_defined?("SERIALIZER_QUERY_KEYS_CACHE")
141
+ self.class::SERIALIZER_QUERY_KEYS_CACHE.each do |query_name|
142
+ cache_key = "#{self.class.name}_____#{query_name}___#{self.id}"
143
+ Rails.logger.info "Serializer: CLEARING CACHE KEY: #{cache_key}" if Serializer.configuration.debug
144
+ Rails.cache.delete(cache_key)
145
+ end
146
+ return true
147
+ else
148
+ # if Serializer.configuration.debug
149
+ Rails.logger.error(
150
+ """
151
+ ERROR. COULD NOT CLEAR SERIALIZER CACHE FOR: Class #{self.class.name}
152
+ Serializer: Class #{self.class.name} may not have the serializer module #{self.class.name}Serializer defined.
153
+ Nor was it defined on an inheriting class.
154
+ """
155
+ )
156
+ # end
157
+ return nil
158
+ end
159
+ end
160
+
161
+ serializer_query_names.each do |query_name|
162
+ serializer_name = query_name[/(?<name>.+)_query/, :name]
163
+ if serializer_name.nil?
164
+ Rails.logger.error "Serializer: #{serializer_klass.name} method #{query_name} does not end in '(.+)_query', as is expected of serializers" if Serializer.configuration.debug
165
+ next
166
+ end
167
+ if serializer_name == 'serializer'
168
+ # No longer necessary to add here. We've added them above.
169
+ # klass.send(:define_method, serializer_name) do |opts = {}|
170
+ # super({json_query_override: query_name}.merge(opts))
171
+ # end
172
+ # klass.send(:define_singleton_method, serializer_name) do |opts = {}|
173
+ # super({json_query_override: query_name}.merge(opts))
174
+ # end
175
+ else
176
+ klass.send(:define_method, serializer_name) do |opts = {}|
177
+ serializer({json_query_override: query_name}.merge(opts))
178
+ end
179
+ klass.send(:define_singleton_method, serializer_name) do |opts = {}|
180
+ serializer({json_query_override: query_name}.merge(opts))
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ # END CLASS EVAL
187
+ end
188
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_json_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin.dana.software.dev@gmail.com
@@ -115,9 +115,8 @@ extensions: []
115
115
  extra_rdoc_files: []
116
116
  files:
117
117
  - lib/serializer.rb
118
- - lib/serializer/application_serializer.rb
119
- - lib/serializer/concern.rb
120
118
  - lib/serializer/configuration.rb
119
+ - lib/serializer/model_serializer.rb
121
120
  homepage: https://github.com/danabr75/rails_json_serializer
122
121
  licenses:
123
122
  - LGPL-3.0-only
@@ -1,10 +0,0 @@
1
- module ApplicationSerializer
2
- def serializer_query opts = {}
3
- {
4
- include: {
5
- },
6
- methods: %w(),
7
- cache_key: __callee__,
8
- }
9
- end
10
- end
@@ -1,244 +0,0 @@
1
- module Serializer
2
- DELETE_MATCHED_SUPPORTED_CACHE_TYPES = [:memory_store, :file_store]
3
- module Concern
4
- # ActiveSupport extend src: https://stackoverflow.com/questions/2328984/rails-extending-activerecordbase
5
- extend ActiveSupport::Concern
6
-
7
- # START MODEL INSTANCE METHODS
8
- def clear_serializer_cache
9
- if self.class.const_defined?("SERIALIZER_QUERY_KEYS_CACHE")
10
-
11
- # list_of_serializer_query_names = "#{self.class.name}::SERIALIZER_QUERY_KEYS_CACHE".constantize
12
- self.class.get_cumulatively_inherited_serializer_query_list.each do |query_name|
13
- cache_key = "#{self.class.name}_____#{query_name}___#{self.id}"
14
- Rails.logger.info "Serializer: CLEARING CACHE KEY: #{cache_key}" if Serializer.configuration.debug
15
- Rails.cache.delete(cache_key)
16
- end
17
- return true
18
- else
19
- # if Serializer.configuration.debug
20
- Rails.logger.error(
21
- """
22
- ERROR. COULD NOT CLEAR SERIALIZER CACHE FOR: Class #{self.class.name}
23
- Serializer: Class #{self.class.name} may not have the serializer module #{self.class.name}Serializer defined.
24
- Nor was it defined on an inheriting class.
25
- """
26
- )
27
- # end
28
- return nil
29
- end
30
- end
31
-
32
- def as_json options = {}
33
- # Not caching records that don't have IDs.
34
- if !Serializer.configuration.disable_model_caching && self.id && options[:cache_key].present? && !(options.key?(:cache_for) && options[:cache_for].nil?)
35
- cache_key = "#{self.class.name}_____#{options[:cache_key]}___#{self.id}"
36
- if Rails.cache.exist?(cache_key)
37
- Rails.logger.info "Serializer: Cache reading #{cache_key}" if Serializer.configuration.debug
38
- return Rails.cache.read(cache_key)
39
- else
40
- data = super(options)
41
- data = self.class.as_json_associations_alias_fix(options, data)
42
- begin
43
- Rails.logger.info "Serializer: Caching #{cache_key} for #{(options[:cache_for] || Serializer.configuration.default_cache_time)} minutes." if Serializer.configuration.debug
44
- Rails.cache.write(cache_key, data, expires_in: (options[:cache_for] || Serializer.configuration.default_cache_time).minute)
45
- rescue Exception => e
46
- Rails.logger.error "Serializer: Internal Server Error on #{self.class}#as_json ID: #{self.id} for cache key: #{cache_key}"
47
- Rails.logger.error e.class
48
- Rails.logger.error e.message
49
- Rails.logger.error e.backtrace
50
- end
51
- return data
52
- end
53
- else
54
- if Serializer.configuration.debug && !Serializer.configuration.disable_model_caching && self.id && options[:cache_key].present? && options.key?(:cache_for) && options[:cache_for].nil?
55
- Rails.logger.info "Serializer: Caching #{cache_key} NOT caching due to `cache_for: nil`"
56
- end
57
- data = super(options)
58
- data = self.class.as_json_associations_alias_fix(options, data)
59
- return data
60
- end
61
- end
62
-
63
- # Can override the query, using the options. ex: {json_query_override: :tiny_serializer_query}
64
- def serializer opts = {}
65
- query = opts[:json_query_override].present? ? self.class.send(opts[:json_query_override], opts) : self.class.serializer_query(opts)
66
- if Serializer.configuration.enable_includes && query[:include].present? && self.class.column_names.include?('id') && self.id.present? && !opts[:skip_eager_loading] && self.respond_to?(:persisted?) && self.persisted?
67
- # It's an extra SQL call, but most likely worth it to pre-load associations
68
- self.class.includes(self.class.generate_includes_from_json_query(query)).find(self.id).as_json(query)
69
- else
70
- as_json(query)
71
- end
72
- end
73
- # END MODEL INSTANCE METHODS
74
-
75
- class_methods do
76
- # START MODEL CLASS METHODS
77
- def inherited subclass
78
- if subclass.const_defined?("#{subclass.name}Serializer")
79
- serializer_klass = "#{subclass.name}Serializer".constantize
80
-
81
- if serializer_klass.class == Module
82
- if !serializer_klass.const_defined?("SerializerClassAndInstanceMethods")
83
- serializer_klass.const_set('SerializerClassAndInstanceMethods', Module.new {})
84
- end
85
- if !serializer_klass.const_defined?("SerializerClassMethods")
86
- serializer_klass.const_set('SerializerClassMethods', Module.new {})
87
- serializer_klass::SerializerClassMethods.send(:define_method, :get_cumulatively_inherited_serializer_query_list) do |opts = {}|
88
- if defined?(super)
89
- return (subclass::SERIALIZER_QUERY_KEYS_CACHE + superclass.get_cumulatively_inherited_serializer_query_list).uniq
90
- else
91
- return subclass::SERIALIZER_QUERY_KEYS_CACHE
92
- end
93
- end
94
- end
95
-
96
- serializer_query_names = serializer_klass.public_instance_methods
97
-
98
- serializer_query_names.each do |query_name|
99
- serializer_name = query_name[/(?<name>.+)_query/, :name]
100
- if serializer_name.nil?
101
- Rails.logger.info "Serializer: #{serializer_klass.name} method #{query_name} does not end in '(.+)_query', as is expected of serializers" if Serializer.configuration.debug
102
- next
103
- end
104
- # Skip if chosen to override it.
105
- next if serializer_klass.respond_to?(serializer_name)
106
- if serializer_name == 'serializer'
107
- serializer_klass::SerializerClassAndInstanceMethods.send(:define_method, serializer_name) do |opts = {}|
108
- super({json_query_override: query_name}.merge(opts))
109
- end
110
- else
111
- serializer_klass::SerializerClassAndInstanceMethods.send(:define_method, serializer_name) do |opts = {}|
112
- serializer({json_query_override: query_name}.merge(opts))
113
- end
114
- end
115
- end
116
- if serializer_query_names.any?
117
- # Inject instance methods
118
- subclass.send(:include, serializer_klass::SerializerClassAndInstanceMethods)
119
- # Inject class methods
120
- subclass.send(:extend, serializer_klass::SerializerClassAndInstanceMethods)
121
- # Inject class methods that has queries
122
- if Serializer.configuration.debug
123
- Rails.logger.info "Injecting queries: #{serializer_klass.public_instance_methods} into class: #{subclass}"
124
- end
125
- puts "Injecting queries: #{serializer_klass.public_instance_methods} into class: #{subclass}"
126
- subclass.send(:extend, serializer_klass)
127
- # Injecting the Serializer Methods as a namespaced class of the rails class, so we can have
128
- # access to the list of methods to clear their cache.
129
- # 'Class Name + Serializer' does not work with inheritence.
130
- subclass.const_set('SERIALIZER_QUERY_KEYS_CACHE', serializer_query_names)
131
- # Inject class methods
132
- subclass.send(:extend, serializer_klass::SerializerClassMethods)
133
-
134
- # Issue with inheritting classes caching the serializer data from queries in super classes.
135
- # Only on the rails server, not the console strangely.
136
- if DELETE_MATCHED_SUPPORTED_CACHE_TYPES.include?(Rails.configuration.cache_store)
137
- serializer_query_names.each do |query_name|
138
- cache_key_prefix = /#{subclass.name}_____#{query_name}___(\d+)/
139
- puts "Deleting cache here: Rails.cache.delete_matched(#{cache_key_prefix})"
140
- Rails.cache.delete_matched(cache_key_prefix)
141
- end
142
- end
143
- end
144
- else
145
- Rails.logger.info "Serializer: #{serializer_klass.name} was not a Module as expected" if Serializer.configuration.debug
146
- end
147
- end
148
- super(subclass)
149
- end
150
-
151
- # Class defined clear serializer
152
- if DELETE_MATCHED_SUPPORTED_CACHE_TYPES.include?(Rails.configuration.cache_store)
153
- def clear_serializer_cache
154
- self.get_cumulatively_inherited_serializer_query_list.each do |query_name|
155
- cache_key_prefix = /#{self.name}_____#{query_name}___(\d+)/
156
- Rails.logger.info "Serializer: CLEARING CACHE KEY Prefix: #{cache_key_prefix}" if Serializer.configuration.debug
157
- Rails.cache.delete_matched(cache_key_prefix)
158
- end
159
- return true
160
- end
161
- else
162
- def clear_serializer_cache
163
- puts "Not supported by rails cache store: #{Rails.configuration.cache_store}. Supported: #{DELETE_MATCHED_SUPPORTED_CACHE_TYPES}"
164
- return false
165
- end
166
- end
167
-
168
- # Can override the query, using the options. ex: {json_query_override: :tiny_children_serializer_query}
169
- def serializer opts = {}
170
- query = opts[:json_query_override].present? ? self.send(opts[:json_query_override], opts) : serializer_query(opts)
171
- if Serializer.configuration.enable_includes && query[:include].present? && !opts[:skip_eager_loading]
172
- includes(generate_includes_from_json_query(query)).as_json(query)
173
- else
174
- # Have to use 'all' gets stack level too deep otherwise. Not sure why.
175
- all.as_json(query)
176
- end
177
- end
178
-
179
- def as_json_associations_alias_fix options, data, opts = {}
180
- if data
181
- # Depth is almost purely for debugging purposes
182
- opts[:depth] ||= 0
183
- if options[:include].present?
184
- options[:include].each do |include_key, include_hash|
185
- # The includes doesn't have to have a hash attached. Skip it if it doesn't.
186
- next if include_hash.nil?
187
- data_key = include_key.to_s
188
- if include_hash[:as].present?
189
- if include_hash[:as].to_s == include_key.to_s
190
- raise "Serializer: Cannot alias json query association to have the same as the original key; as: #{include_hash[:as].to_s}; original_key: #{include_key.to_s} on self: #{name}"
191
- end
192
- alias_name = include_hash[:as]
193
- data[alias_name.to_s] = data[include_key.to_s]
194
- data.delete(include_key.to_s)
195
- data_key = alias_name.to_s
196
- end
197
- # At this point, the data could be an array of objects, with no as_json options.
198
- if !data[data_key].is_a?(Array)
199
- data[data_key] = as_json_associations_alias_fix(include_hash, data[data_key], {depth: opts[:depth] + 1})
200
- else
201
- data[data_key].each_with_index do |value,i|
202
- data[data_key][i] = as_json_associations_alias_fix(include_hash, value, {depth: opts[:depth] + 1})
203
- end
204
- end
205
- end
206
- end
207
- end
208
- return data
209
- end
210
-
211
- def generate_includes_from_json_query options = {}, klass = nil
212
- query_filter = {}
213
- klass = self if klass.nil?
214
- if options[:include].present? && !options[:skip_eager_loading]
215
- options[:include].each do |include_key, include_hash|
216
- next if include_hash[:skip_eager_loading] == true
217
- # Will 'next' if there is a scope that takes arguments, an instance-dependent scope.
218
- # Can't eager load when assocation has a instance condition for it's associative scope.
219
- # Might not be a real assocation
220
- next if klass.reflect_on_association(include_key).nil?
221
- next if klass.reflect_on_association(include_key).scope&.arity&.nonzero?
222
- query_filter[include_key] = {}
223
- next if include_hash.none?
224
- query_filter[include_key] = generate_includes_from_json_query(include_hash, klass.reflect_on_association(include_key).klass)
225
- end
226
- end
227
- # Does not include data, just eager-loads. Useful when methods need assocations, but you don't need association data.
228
- if options[:eager_include].present?
229
- options[:eager_include].each do |include_key|
230
- # Will 'next' if there is a scope that takes arguments, an instance-dependent scope.
231
- # Can't eager load when assocation has a instance condition for it's associative scope.
232
- # Might not be a real assocation
233
- next if klass.reflect_on_association(include_key).nil?
234
- next if klass.reflect_on_association(include_key).scope&.arity&.nonzero?
235
- query_filter[include_key] ||= {}
236
- end
237
- end
238
- return query_filter
239
- end
240
- # END MODEL CLASS METHODS
241
-
242
- end
243
- end
244
- end