Class: JSONAPI::ShowRelatedResourcesOperation

Inherits:
Operation
  • Object
show all
Defined in:
lib/jsonapi/operation.rb

Instance Attribute Summary collapse

Attributes inherited from Operation

#resource_klass, #transactional

Instance Method Summary collapse

Constructor Details

#initialize(resource_klass, options = {}) ⇒ ShowRelatedResourcesOperation

Returns a new instance of ShowRelatedResourcesOperation.



141
142
143
144
145
146
147
148
149
150
# File 'lib/jsonapi/operation.rb', line 141

def initialize(resource_klass, options = {})
  super(resource_klass, options)
  @source_klass = options.fetch(:source_klass)
  @source_id = options.fetch(:source_id)
  @relationship_type = options.fetch(:relationship_type)
  @filters = options[:filters]
  @sort_criteria = options[:sort_criteria]
  @paginator = options[:paginator]
  @transactional = false
end

Instance Attribute Details

#filtersObject (readonly)

Returns the value of attribute filters.



139
140
141
# File 'lib/jsonapi/operation.rb', line 139

def filters
  @filters
end

#paginatorObject (readonly)

Returns the value of attribute paginator.



139
140
141
# File 'lib/jsonapi/operation.rb', line 139

def paginator
  @paginator
end

#relationship_typeObject (readonly)

Returns the value of attribute relationship_type.



139
140
141
# File 'lib/jsonapi/operation.rb', line 139

def relationship_type
  @relationship_type
end

#sort_criteriaObject (readonly)

Returns the value of attribute sort_criteria.



139
140
141
# File 'lib/jsonapi/operation.rb', line 139

def sort_criteria
  @sort_criteria
end

#source_idObject (readonly)

Returns the value of attribute source_id.



139
140
141
# File 'lib/jsonapi/operation.rb', line 139

def source_id
  @source_id
end

#source_klassObject (readonly)

Returns the value of attribute source_klass.



139
140
141
# File 'lib/jsonapi/operation.rb', line 139

def source_klass
  @source_klass
end

Instance Method Details

#applyObject



182
183
184
185
186
187
188
189
190
191
192
# File 'lib/jsonapi/operation.rb', line 182

def apply
  related_resource = source_resource.public_send(@relationship_type,
                                          filters:  @filters,
                                          sort_criteria: @sort_criteria,
                                          paginator: @paginator)

  return JSONAPI::RelatedResourcesOperationResult.new(:ok, source_resource, @relationship_type, related_resource, options)

rescue JSONAPI::Exceptions::Error => e
  return JSONAPI::ErrorsOperationResult.new(e.errors[0].code, e.errors)
end

#optionsObject



175
176
177
178
179
180
# File 'lib/jsonapi/operation.rb', line 175

def options
  opts = {}
  opts.merge!(pagination_params: pagination_params) if JSONAPI.configuration.top_level_links_include_pagination
  opts.merge!(record_count: record_count) if JSONAPI.configuration.top_level_meta_include_record_count
  opts
end

#pagination_paramsObject



165
166
167
168
169
170
171
172
173
# File 'lib/jsonapi/operation.rb', line 165

def pagination_params
  if @paginator && JSONAPI.configuration.top_level_links_include_pagination
    options = {}
    options[:record_count] = record_count if @paginator.class.requires_record_count
    @paginator.links_page_params(options)
  else
    {}
  end
end

#record_countObject



152
153
154
# File 'lib/jsonapi/operation.rb', line 152

def record_count
  @_record_count ||= records.count(:all)
end

#recordsObject



160
161
162
163
# File 'lib/jsonapi/operation.rb', line 160

def records
  related_resource_records = source_resource.public_send("records_for_" + @relationship_type)
  @resource_klass.filter_records(@filters, @options, related_resource_records)
end

#source_resourceObject



156
157
158
# File 'lib/jsonapi/operation.rb', line 156

def source_resource
  @_source_resource ||= @source_klass.find_by_key(@source_id, context: @context)
end