jsonapi-resources 0.10.2 → 0.10.7

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: d101bf5764e1eb80096aeeed45eed01a532e183995908d9f66a2143cb78e24df
4
- data.tar.gz: 38911d1428d934a71d06bfac0ad0661a2faa25af2b5de9ac695ec5b620b4c011
3
+ metadata.gz: d30a2ea26f6bb9f907e0710a7e9d95a9682bfa64ab0fd7ae1e5b350c07f52924
4
+ data.tar.gz: fd883de5a6506f4aaad03fcf3ec61ec311c0e57f0cf33ea8c3d8b082c47b2671
5
5
  SHA512:
6
- metadata.gz: 6ec8d28ba3b475796ba5947bec8f548c154acfbf73ae3af44c0c20516dd4b756a45d3cbd4797f0162bbdc288e0b055599ef5044f500babdcf19ced3509887021
7
- data.tar.gz: 4698f7ddd9b9893e310c00fde96d8fef84d0e79ad3261ed574b08c7b60d1e415f5565eb8620752d11136e16df63675c7923006ea6344805a1fd102634bd27e2d
6
+ metadata.gz: cc53b7071fb93b2f2f5c8ff2f02b43572a56d5da8a58835cff73953100db55c0ea9dbc2a1d26b7b06ae854d8e588276619d7631a4dc509e7c6332b9ced5c6245
7
+ data.tar.gz: d9f77c39f058f3978b20ccba5d2beea4744bbda9cb1b19933ed9a3a235a5265a9fecb945a2fd3646f0135cb97059896be3ac2fa19023a94fd555480ac8483f95
@@ -147,9 +147,15 @@ module JSONAPI
147
147
  related_resource_klass = join_details[:related_resource_klass]
148
148
  join_type = relationship_details[:join_type]
149
149
 
150
+ join_options = {
151
+ relationship: relationship,
152
+ relationship_details: relationship_details,
153
+ related_resource_klass: related_resource_klass,
154
+ }
155
+
150
156
  if relationship == :root
151
157
  unless source_relationship
152
- add_join_details('', {alias: resource_klass._table_name, join_type: :root})
158
+ add_join_details('', {alias: resource_klass._table_name, join_type: :root, join_options: join_options})
153
159
  end
154
160
  next
155
161
  end
@@ -163,7 +169,7 @@ module JSONAPI
163
169
  options: options)
164
170
  }
165
171
 
166
- details = {alias: self.class.alias_from_arel_node(join_node), join_type: join_type}
172
+ details = {alias: self.class.alias_from_arel_node(join_node), join_type: join_type, join_options: join_options}
167
173
 
168
174
  if relationship == source_relationship
169
175
  if relationship.polymorphic? && relationship.belongs_to?
@@ -114,11 +114,11 @@ module JSONAPI
114
114
  # This alias is going to be resolve down to the model's table name and will not actually be an alias
115
115
  resource_table_alias = resource_klass._table_name
116
116
 
117
- pluck_fields = [Arel.sql("#{concat_table_field(resource_table_alias, resource_klass._primary_key)} AS #{resource_table_alias}_#{resource_klass._primary_key}")]
117
+ pluck_fields = [sql_field_with_alias(resource_table_alias, resource_klass._primary_key)]
118
118
 
119
119
  cache_field = attribute_to_model_field(:_cache_field) if options[:cache]
120
120
  if cache_field
121
- pluck_fields << Arel.sql("#{concat_table_field(resource_table_alias, cache_field[:name])} AS #{resource_table_alias}_#{cache_field[:name]}")
121
+ pluck_fields << sql_field_with_alias(resource_table_alias, cache_field[:name])
122
122
  end
123
123
 
124
124
  linkage_fields = []
@@ -133,7 +133,7 @@ module JSONAPI
133
133
 
134
134
  linkage_table_alias = join_manager.join_details_by_polymorphic_relationship(linkage_relationship, resource_type)[:alias]
135
135
  primary_key = klass._primary_key
136
- pluck_fields << Arel.sql("#{concat_table_field(linkage_table_alias, primary_key)} AS #{linkage_table_alias}_#{primary_key}")
136
+ pluck_fields << sql_field_with_alias(linkage_table_alias, primary_key)
137
137
  end
138
138
  else
139
139
  klass = linkage_relationship.resource_klass
@@ -141,7 +141,7 @@ module JSONAPI
141
141
 
142
142
  linkage_table_alias = join_manager.join_details_by_relationship(linkage_relationship)[:alias]
143
143
  primary_key = klass._primary_key
144
- pluck_fields << Arel.sql("#{concat_table_field(linkage_table_alias, primary_key)} AS #{linkage_table_alias}_#{primary_key}")
144
+ pluck_fields << sql_field_with_alias(linkage_table_alias, primary_key)
145
145
  end
146
146
  end
147
147
 
@@ -150,7 +150,7 @@ module JSONAPI
150
150
  attributes.try(:each) do |attribute|
151
151
  model_field = resource_klass.attribute_to_model_field(attribute)
152
152
  model_fields[attribute] = model_field
153
- pluck_fields << Arel.sql("#{concat_table_field(resource_table_alias, model_field[:name])} AS #{resource_table_alias}_#{model_field[:name]}")
153
+ pluck_fields << sql_field_with_alias(resource_table_alias, model_field[:name])
154
154
  end
155
155
 
156
156
  sort_fields = options.dig(:_relation_helper_options, :sort_fields)
@@ -324,6 +324,11 @@ module JSONAPI
324
324
  records = records.joins_left(relation_name)
325
325
  end
326
326
  end
327
+
328
+ if relationship.use_related_resource_records_for_joins
329
+ records = records.merge(self.records(options))
330
+ end
331
+
327
332
  records
328
333
  end
329
334
 
@@ -395,7 +400,7 @@ module JSONAPI
395
400
  sort_criteria: sort_criteria,
396
401
  filters: filters)
397
402
 
398
- paginator = options[:paginator] if source_rids.count == 1
403
+ paginator = options[:paginator]
399
404
 
400
405
  records = apply_request_settings_to_records(records: records_for_source_to_related(options),
401
406
  resource_klass: resource_klass,
@@ -409,13 +414,13 @@ module JSONAPI
409
414
  resource_table_alias = join_manager.join_details_by_relationship(relationship)[:alias]
410
415
 
411
416
  pluck_fields = [
412
- Arel.sql("#{_table_name}.#{_primary_key} AS source_id"),
413
- Arel.sql("#{concat_table_field(resource_table_alias, resource_klass._primary_key)} AS #{resource_table_alias}_#{resource_klass._primary_key}")
417
+ Arel.sql("#{_table_name}.#{_primary_key} AS \"source_id\""),
418
+ sql_field_with_alias(resource_table_alias, resource_klass._primary_key)
414
419
  ]
415
420
 
416
421
  cache_field = resource_klass.attribute_to_model_field(:_cache_field) if options[:cache]
417
422
  if cache_field
418
- pluck_fields << Arel.sql("#{concat_table_field(resource_table_alias, cache_field[:name])} AS #{resource_table_alias}_#{cache_field[:name]}")
423
+ pluck_fields << sql_field_with_alias(resource_table_alias, cache_field[:name])
419
424
  end
420
425
 
421
426
  linkage_fields = []
@@ -430,7 +435,7 @@ module JSONAPI
430
435
 
431
436
  linkage_table_alias = join_manager.join_details_by_polymorphic_relationship(linkage_relationship, resource_type)[:alias]
432
437
  primary_key = klass._primary_key
433
- pluck_fields << Arel.sql("#{concat_table_field(linkage_table_alias, primary_key)} AS #{linkage_table_alias}_#{primary_key}")
438
+ pluck_fields << sql_field_with_alias(linkage_table_alias, primary_key)
434
439
  end
435
440
  else
436
441
  klass = linkage_relationship.resource_klass
@@ -438,7 +443,7 @@ module JSONAPI
438
443
 
439
444
  linkage_table_alias = join_manager.join_details_by_relationship(linkage_relationship)[:alias]
440
445
  primary_key = klass._primary_key
441
- pluck_fields << Arel.sql("#{concat_table_field(linkage_table_alias, primary_key)} AS #{linkage_table_alias}_#{primary_key}")
446
+ pluck_fields << sql_field_with_alias(linkage_table_alias, primary_key)
442
447
  end
443
448
  end
444
449
 
@@ -447,7 +452,7 @@ module JSONAPI
447
452
  attributes.try(:each) do |attribute|
448
453
  model_field = resource_klass.attribute_to_model_field(attribute)
449
454
  model_fields[attribute] = model_field
450
- pluck_fields << Arel.sql("#{concat_table_field(resource_table_alias, model_field[:name])} AS #{resource_table_alias}_#{model_field[:name]}")
455
+ pluck_fields << sql_field_with_alias(resource_table_alias, model_field[:name])
451
456
  end
452
457
 
453
458
  sort_fields = options.dig(:_relation_helper_options, :sort_fields)
@@ -525,7 +530,7 @@ module JSONAPI
525
530
  relationships: linkage_relationships,
526
531
  filters: filters)
527
532
 
528
- paginator = options[:paginator] if source_rids.count == 1
533
+ paginator = options[:paginator]
529
534
 
530
535
  # Note: We will sort by the source table. Without using unions we can't sort on a polymorphic relationship
531
536
  # in any manner that makes sense
@@ -543,9 +548,9 @@ module JSONAPI
543
548
  related_type = concat_table_field(_table_name, relationship.polymorphic_type)
544
549
 
545
550
  pluck_fields = [
546
- Arel.sql("#{primary_key} AS #{_table_name}_#{_primary_key}"),
547
- Arel.sql("#{related_key} AS #{_table_name}_#{relationship.foreign_key}"),
548
- Arel.sql("#{related_type} AS #{_table_name}_#{relationship.polymorphic_type}")
551
+ Arel.sql("#{primary_key} AS #{alias_table_field(_table_name, _primary_key)}"),
552
+ Arel.sql("#{related_key} AS #{alias_table_field(_table_name, relationship.foreign_key)}"),
553
+ Arel.sql("#{related_type} AS #{alias_table_field(_table_name, relationship.polymorphic_type)}")
549
554
  ]
550
555
 
551
556
  # Get the additional fields from each relation. There's a limitation that the fields must exist in each relation
@@ -570,7 +575,7 @@ module JSONAPI
570
575
 
571
576
  cache_offset = relation_index
572
577
  if cache_field
573
- pluck_fields << Arel.sql("#{concat_table_field(table_alias, cache_field[:name])} AS cache_#{type}_#{cache_field[:name]}")
578
+ pluck_fields << sql_field_with_alias(table_alias, cache_field[:name])
574
579
  relation_index+= 1
575
580
  end
576
581
 
@@ -579,7 +584,7 @@ module JSONAPI
579
584
  attributes.try(:each) do |attribute|
580
585
  model_field = related_klass.attribute_to_model_field(attribute)
581
586
  model_fields[attribute] = model_field
582
- pluck_fields << Arel.sql("#{concat_table_field(table_alias, model_field[:name])} AS #{table_alias}_#{model_field[:name]}")
587
+ pluck_fields << sql_field_with_alias(table_alias, model_field[:name])
583
588
  relation_index+= 1
584
589
  end
585
590
 
@@ -616,7 +621,7 @@ module JSONAPI
616
621
 
617
622
  linkage_table_alias = join_manager.join_details_by_polymorphic_relationship(linkage_relationship, resource_type)[:alias]
618
623
  primary_key = klass._primary_key
619
- pluck_fields << Arel.sql("#{concat_table_field(linkage_table_alias, primary_key)} AS #{linkage_table_alias}_#{primary_key}")
624
+ pluck_fields << sql_field_with_alias(linkage_table_alias, primary_key)
620
625
  end
621
626
  else
622
627
  klass = linkage_relationship.resource_klass
@@ -624,7 +629,7 @@ module JSONAPI
624
629
 
625
630
  linkage_table_alias = join_manager.join_details_by_relationship(linkage_relationship)[:alias]
626
631
  primary_key = klass._primary_key
627
- pluck_fields << Arel.sql("#{concat_table_field(linkage_table_alias, primary_key)} AS #{linkage_table_alias}_#{primary_key}")
632
+ pluck_fields << sql_field_with_alias(linkage_table_alias, primary_key)
628
633
  end
629
634
  end
630
635
 
@@ -649,7 +654,7 @@ module JSONAPI
649
654
  end
650
655
  end
651
656
 
652
- relation_position = relation_positions[row[2].downcase.pluralize]
657
+ relation_position = relation_positions[row[2].underscore.pluralize]
653
658
  model_fields = relation_position[:model_fields]
654
659
  cache_field = relation_position[:cache_field]
655
660
  cache_offset = relation_position[:cache_offset]
@@ -756,7 +761,7 @@ module JSONAPI
756
761
 
757
762
  # Assumes ActiveRecord's counting. Override if you need a different counting method
758
763
  def count_records(records)
759
- if Rails::VERSION::MAJOR >= 5 && ActiveRecord::VERSION::MINOR >= 1
764
+ if (Rails::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR >= 1) || Rails::VERSION::MAJOR >= 6
760
765
  records.count(:all)
761
766
  else
762
767
  records.count
@@ -790,7 +795,31 @@ module JSONAPI
790
795
  if table.blank? || field.to_s.include?('.')
791
796
  # :nocov:
792
797
  if quoted
793
- "\"#{field.to_s}\""
798
+ quote(field)
799
+ else
800
+ field.to_s
801
+ end
802
+ # :nocov:
803
+ else
804
+ if quoted
805
+ "#{quote(table)}.#{quote(field)}"
806
+ else
807
+ # :nocov:
808
+ "#{table.to_s}.#{field.to_s}"
809
+ # :nocov:
810
+ end
811
+ end
812
+ end
813
+
814
+ def sql_field_with_alias(table, field, quoted = true)
815
+ Arel.sql("#{concat_table_field(table, field, quoted)} AS #{alias_table_field(table, field, quoted)}")
816
+ end
817
+
818
+ def alias_table_field(table, field, quoted = false)
819
+ if table.blank? || field.to_s.include?('.')
820
+ # :nocov:
821
+ if quoted
822
+ quote(field)
794
823
  else
795
824
  field.to_s
796
825
  end
@@ -798,14 +827,19 @@ module JSONAPI
798
827
  else
799
828
  if quoted
800
829
  # :nocov:
801
- "\"#{table.to_s}\".\"#{field.to_s}\""
830
+ quote("#{table.to_s}_#{field.to_s}")
802
831
  # :nocov:
803
832
  else
804
- "#{table.to_s}.#{field.to_s}"
833
+ "#{table.to_s}_#{field.to_s}"
805
834
  end
806
835
  end
807
836
  end
808
837
 
838
+ def quote(field)
839
+ "\"#{field.to_s}\""
840
+ end
841
+
842
+
809
843
  def apply_filters(records, filters, options = {})
810
844
  if filters
811
845
  filters.each do |filter, value|
@@ -873,7 +873,7 @@ module JSONAPI
873
873
  if !_polymorphic
874
874
  ''
875
875
  else
876
- @_polymorphic_name ||= _model_name.to_s.downcase
876
+ @_polymorphic_name ||= _model_name.to_s.underscore
877
877
  end
878
878
  end
879
879
 
@@ -927,7 +927,7 @@ module JSONAPI
927
927
  next unless Module === klass
928
928
  if klass < ActiveRecord::Base
929
929
  klass.reflect_on_all_associations(:has_many).select{|r| r.options[:as] }.each do |reflection|
930
- (hash[reflection.options[:as]] ||= []) << klass.name.downcase
930
+ (hash[reflection.options[:as]] ||= []) << klass.name.underscore
931
931
  end
932
932
  end
933
933
  end
@@ -1058,7 +1058,7 @@ module JSONAPI
1058
1058
  end
1059
1059
 
1060
1060
  def construct_order_options(sort_params)
1061
- sort_params ||= default_sort
1061
+ sort_params = default_sort if sort_params.blank?
1062
1062
 
1063
1063
  return {} unless sort_params
1064
1064
 
@@ -51,8 +51,8 @@ module JSONAPI
51
51
  @fetchable_fields = Set.new(fetchable_fields)
52
52
 
53
53
  # Relationships left uncompiled because we'll often want to insert included ids on retrieval
54
- @relationships = relationships
55
-
54
+ # Remove the data since that should not be cached
55
+ @relationships = relationships&.transform_values {|v| v.delete_if {|k, _v| k == 'data'} }
56
56
  @links_json = CompiledJson.of(links_json)
57
57
  @attributes_json = CompiledJson.of(attributes_json)
58
58
  @meta_json = CompiledJson.of(meta_json)
@@ -18,7 +18,7 @@ module JSONAPI
18
18
  :default_paginator,
19
19
  :default_page_size,
20
20
  :maximum_page_size,
21
- :default_processor_klass,
21
+ :default_processor_klass_name,
22
22
  :use_text_errors,
23
23
  :top_level_links_include_pagination,
24
24
  :top_level_meta_include_record_count,
@@ -39,7 +39,8 @@ module JSONAPI
39
39
  :default_resource_cache_field,
40
40
  :resource_cache_digest_function,
41
41
  :resource_cache_usage_report_function,
42
- :default_exclude_links
42
+ :default_exclude_links,
43
+ :use_related_resource_records_for_joins
43
44
 
44
45
  def initialize
45
46
  #:underscored_key, :camelized_key, :dasherized_key, or custom
@@ -110,7 +111,7 @@ module JSONAPI
110
111
 
111
112
  # The default Operation Processor to use if one is not defined specifically
112
113
  # for a Resource.
113
- self.default_processor_klass = JSONAPI::Processor
114
+ self.default_processor_klass_name = 'JSONAPI::Processor'
114
115
 
115
116
  # Allows transactions for creating and updating records
116
117
  # Set this to false if your backend does not support transactions (e.g. Mongodb)
@@ -158,6 +159,11 @@ module JSONAPI
158
159
  # and relationships. Accepts either `:default`, `:none`, or array containing the
159
160
  # specific default links to exclude, which may be `:self` and `:related`.
160
161
  self.default_exclude_links = :none
162
+
163
+ # Use a related resource's `records` when performing joins. This setting allows included resources to account for
164
+ # permission scopes. It can be overridden explicitly per relationship. Furthermore, specifying a `relation_name`
165
+ # on a relationship will cause this setting to be ignored.
166
+ self.use_related_resource_records_for_joins = true
161
167
  end
162
168
 
163
169
  def cache_formatters=(bool)
@@ -225,9 +231,19 @@ module JSONAPI
225
231
  end
226
232
 
227
233
  def default_processor_klass=(default_processor_klass)
234
+ ActiveSupport::Deprecation.warn('`default_processor_klass` has been replaced by `default_processor_klass_name`.')
228
235
  @default_processor_klass = default_processor_klass
229
236
  end
230
237
 
238
+ def default_processor_klass
239
+ @default_processor_klass ||= default_processor_klass_name.safe_constantize
240
+ end
241
+
242
+ def default_processor_klass_name=(default_processor_klass_name)
243
+ @default_processor_klass = nil
244
+ @default_processor_klass_name = default_processor_klass_name
245
+ end
246
+
231
247
  def allow_include=(allow_include)
232
248
  ActiveSupport::Deprecation.warn('`allow_include` has been replaced by `default_allow_include_to_one` and `default_allow_include_to_many` options.')
233
249
  @default_allow_include_to_one = allow_include
@@ -289,6 +305,8 @@ module JSONAPI
289
305
  attr_writer :resource_cache_usage_report_function
290
306
 
291
307
  attr_writer :default_exclude_links
308
+
309
+ attr_writer :use_related_resource_records_for_joins
292
310
  end
293
311
 
294
312
  class << self
@@ -13,9 +13,16 @@ module JSONAPI
13
13
  # :nocov:
14
14
  end
15
15
 
16
+ def requires_record_count
17
+ # :nocov:
18
+ self.class.requires_record_count
19
+ # :nocov:
20
+ end
21
+
16
22
  class << self
17
23
  def requires_record_count
18
24
  # :nocov:
25
+ # @deprecated
19
26
  false
20
27
  # :nocov:
21
28
  end
@@ -36,10 +43,15 @@ class OffsetPaginator < JSONAPI::Paginator
36
43
  verify_pagination_params
37
44
  end
38
45
 
46
+ # @deprecated
39
47
  def self.requires_record_count
40
48
  true
41
49
  end
42
50
 
51
+ def requires_record_count
52
+ true
53
+ end
54
+
43
55
  def apply(relation, _order_options)
44
56
  relation.offset(@offset).limit(@limit)
45
57
  end
@@ -127,10 +139,15 @@ class PagedPaginator < JSONAPI::Paginator
127
139
  verify_pagination_params
128
140
  end
129
141
 
142
+ # @deprecated
130
143
  def self.requires_record_count
131
144
  true
132
145
  end
133
146
 
147
+ def requires_record_count
148
+ true
149
+ end
150
+
134
151
  def calculate_page_count(record_count)
135
152
  (record_count / @size.to_f).ceil
136
153
  end
@@ -30,7 +30,7 @@ module JSONAPI
30
30
  end
31
31
 
32
32
  def eql?(other)
33
- relationship == other.relationship && resource_klass == other.resource_klass
33
+ other.is_a?(JSONAPI::PathSegment::Relationship) && relationship == other.relationship && resource_klass == other.resource_klass
34
34
  end
35
35
 
36
36
  def hash
@@ -59,7 +59,7 @@ module JSONAPI
59
59
  end
60
60
 
61
61
  def eql?(other)
62
- field_name == other.field_name && resource_klass == other.resource_klass
62
+ other.is_a?(JSONAPI::PathSegment::Field) && field_name == other.field_name && resource_klass == other.resource_klass
63
63
  end
64
64
 
65
65
  def delegated_field_name
@@ -65,13 +65,13 @@ module JSONAPI
65
65
  resource_set.populate!(serializer, context, find_options)
66
66
 
67
67
  page_options = result_options
68
- if (JSONAPI.configuration.top_level_meta_include_record_count || (paginator && paginator.class.requires_record_count))
68
+ if (top_level_meta_include_record_count || (paginator && paginator.requires_record_count))
69
69
  page_options[:record_count] = resource_klass.count(verified_filters,
70
70
  context: context,
71
71
  include_directives: include_directives)
72
72
  end
73
73
 
74
- if (JSONAPI.configuration.top_level_meta_include_page_count && paginator && page_options[:record_count])
74
+ if (top_level_meta_include_page_count && paginator && page_options[:record_count])
75
75
  page_options[:page_count] = paginator ? paginator.calculate_page_count(page_options[:record_count]) : 1
76
76
  end
77
77
 
@@ -197,9 +197,9 @@ module JSONAPI
197
197
  resource_set.populate!(serializer, context, find_options)
198
198
 
199
199
  opts = result_options
200
- if ((JSONAPI.configuration.top_level_meta_include_record_count) ||
201
- (paginator && paginator.class.requires_record_count) ||
202
- (JSONAPI.configuration.top_level_meta_include_page_count))
200
+ if ((top_level_meta_include_record_count) ||
201
+ (paginator && paginator.requires_record_count) ||
202
+ (top_level_meta_include_page_count))
203
203
 
204
204
  opts[:record_count] = source_resource.class.count_related(
205
205
  source_resource.identity,
@@ -207,13 +207,13 @@ module JSONAPI
207
207
  find_options)
208
208
  end
209
209
 
210
- if (JSONAPI.configuration.top_level_meta_include_page_count && opts[:record_count])
210
+ if (top_level_meta_include_page_count && opts[:record_count])
211
211
  opts[:page_count] = paginator.calculate_page_count(opts[:record_count])
212
212
  end
213
213
 
214
214
  opts[:pagination_params] = if paginator && JSONAPI.configuration.top_level_links_include_pagination
215
215
  page_options = {}
216
- page_options[:record_count] = opts[:record_count] if paginator.class.requires_record_count
216
+ page_options[:record_count] = opts[:record_count] if paginator.requires_record_count
217
217
  paginator.links_page_params(page_options.merge(fetched_resources: resource_set))
218
218
  else
219
219
  {}
@@ -382,6 +382,14 @@ module JSONAPI
382
382
  JSONAPI::ResourceSet.new(resource_id_tree)
383
383
  end
384
384
 
385
+ def top_level_meta_include_record_count
386
+ JSONAPI.configuration.top_level_meta_include_record_count
387
+ end
388
+
389
+ def top_level_meta_include_page_count
390
+ JSONAPI.configuration.top_level_meta_include_page_count
391
+ end
392
+
385
393
  private
386
394
  def find_related_resource_id_tree(resource_klass, source_id, relationship_name, find_options, include_related)
387
395
  options = find_options.except(:include_directives)
@@ -392,7 +400,7 @@ module JSONAPI
392
400
  primary_resource_id_tree = PrimaryResourceIdTree.new
393
401
  primary_resource_id_tree.add_resource_fragments(fragments, include_related)
394
402
 
395
- load_included(resource_klass, primary_resource_id_tree, include_related, options.except(:filters, :sort_criteria))
403
+ load_included(resource_klass, primary_resource_id_tree, include_related, options)
396
404
 
397
405
  primary_resource_id_tree
398
406
  end
@@ -406,7 +414,7 @@ module JSONAPI
406
414
  primary_resource_id_tree = PrimaryResourceIdTree.new
407
415
  primary_resource_id_tree.add_resource_fragments(fragments, include_related)
408
416
 
409
- load_included(resource_klass, primary_resource_id_tree, include_related, options.except(:filters, :sort_criteria))
417
+ load_included(resource_klass, primary_resource_id_tree, include_related, options)
410
418
 
411
419
  primary_resource_id_tree
412
420
  end
@@ -422,7 +430,7 @@ module JSONAPI
422
430
  primary_resource_id_tree = PrimaryResourceIdTree.new
423
431
  primary_resource_id_tree.add_resource_fragments(fragments, include_related)
424
432
 
425
- load_included(resource_klass, primary_resource_id_tree, include_related, options.except(:filters, :sort_criteria))
433
+ load_included(resource_klass, primary_resource_id_tree, include_related, options)
426
434
 
427
435
  primary_resource_id_tree
428
436
  end
@@ -434,7 +442,7 @@ module JSONAPI
434
442
  relationship = resource_klass._relationship(key)
435
443
  relationship_name = relationship.name.to_sym
436
444
 
437
- find_related_resource_options = options.dup
445
+ find_related_resource_options = options.except(:filters, :sort_criteria, :paginator)
438
446
  find_related_resource_options[:sort_criteria] = relationship.resource_klass.default_sort
439
447
  find_related_resource_options[:cache] = resource_klass.caching?
440
448
 
@@ -3,7 +3,7 @@ module JSONAPI
3
3
  attr_reader :acts_as_set, :foreign_key, :options, :name,
4
4
  :class_name, :polymorphic, :always_include_optional_linkage_data,
5
5
  :parent_resource, :eager_load_on_include, :custom_methods,
6
- :inverse_relationship, :allow_include
6
+ :inverse_relationship, :allow_include, :use_related_resource_records_for_joins
7
7
 
8
8
  attr_writer :allow_include
9
9
 
@@ -23,6 +23,15 @@ module JSONAPI
23
23
  @polymorphic_types ||= options[:polymorphic_relations]
24
24
  end
25
25
 
26
+ use_related_resource_records_for_joins_default = if options[:relation_name]
27
+ false
28
+ else
29
+ JSONAPI.configuration.use_related_resource_records_for_joins
30
+ end
31
+
32
+ @use_related_resource_records_for_joins = options.fetch(:use_related_resource_records_for_joins,
33
+ use_related_resource_records_for_joins_default) == true
34
+
26
35
  @always_include_optional_linkage_data = options.fetch(:always_include_optional_linkage_data, false) == true
27
36
  @eager_load_on_include = options.fetch(:eager_load_on_include, false) == true
28
37
  @allow_include = options[:allow_include]
@@ -63,7 +72,7 @@ module JSONAPI
63
72
  next unless Module === klass
64
73
  if ActiveRecord::Base > klass
65
74
  klass.reflect_on_all_associations(:has_many).select{|r| r.options[:as] }.each do |reflection|
66
- (hash[reflection.options[:as]] ||= []) << klass.name.downcase
75
+ (hash[reflection.options[:as]] ||= []) << klass.name.underscore
67
76
  end
68
77
  end
69
78
  end
@@ -418,7 +418,7 @@ module JSONAPI
418
418
  sorts = sort_criteria
419
419
  elsif sort_criteria.is_a?(String)
420
420
  begin
421
- raw = URI.unescape(sort_criteria)
421
+ raw = URI.decode_www_form_component(sort_criteria)
422
422
  sorts = CSV.parse_line(raw)
423
423
  rescue CSV::MalformedCSVError
424
424
  fail JSONAPI::Exceptions::InvalidSortCriteria.new(format_key(resource_klass._type), raw)
@@ -5,10 +5,10 @@ module JSONAPI
5
5
  ActionController::Rendering,
6
6
  ActionController::Renderers::All,
7
7
  ActionController::StrongParameters,
8
- ActionController::ForceSSL,
8
+ Gem::Requirement.new('< 6.1').satisfied_by?(ActionPack.gem_version) ? ActionController::ForceSSL : nil,
9
9
  ActionController::Instrumentation,
10
10
  JSONAPI::ActsAsResourceController
11
- ].freeze
11
+ ].compact.freeze
12
12
 
13
13
  # Note, the url_helpers are not loaded. This will prevent links from being generated for resources, and warnings
14
14
  # will be emitted. Link support can be added by including `Rails.application.routes.url_helpers`, and links
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Resources
3
- VERSION = '0.10.2'
3
+ VERSION = '0.10.7'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,30 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.10.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Gebhardt
8
8
  - Larry Gebhardt
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-12-11 00:00:00.000000000 Z
12
+ date: 2022-03-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 1.17.3
20
+ version: '1.17'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 1.17.3
27
+ version: '1.17'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -232,7 +232,7 @@ homepage: https://github.com/cerebris/jsonapi-resources
232
232
  licenses:
233
233
  - MIT
234
234
  metadata: {}
235
- post_install_message:
235
+ post_install_message:
236
236
  rdoc_options: []
237
237
  require_paths:
238
238
  - lib
@@ -247,8 +247,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
247
  - !ruby/object:Gem::Version
248
248
  version: '0'
249
249
  requirements: []
250
- rubygems_version: 3.0.3
251
- signing_key:
250
+ rubygems_version: 3.1.6
251
+ signing_key:
252
252
  specification_version: 4
253
253
  summary: Easily support JSON API in Rails.
254
254
  test_files: []