Class: RestPack::Serializer::SideLoadDataBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/restpack_serializer/serializable/side_load_data_builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(association, models, serializer) ⇒ SideLoadDataBuilder

Returns a new instance of SideLoadDataBuilder.



5
6
7
8
9
# File 'lib/restpack_serializer/serializable/side_load_data_builder.rb', line 5

def initialize(association, models, serializer)
  @association = association
  @models = models
  @serializer = serializer
end

Instance Method Details

#side_load_belongs_toObject



11
12
13
14
15
16
# File 'lib/restpack_serializer/serializable/side_load_data_builder.rb', line 11

def side_load_belongs_to
  foreign_keys = @models.map { |model| model.send(@association.foreign_key) }.uniq.compact
  side_load = foreign_keys.any? ? @association.klass.find(foreign_keys) : []
  json_model_data = side_load.map { |model| @serializer.as_json(model) }
  { @association.plural_name.to_sym => json_model_data, meta: { } }
end

#side_load_has_and_belongs_to_manyObject



30
31
32
33
34
35
36
37
38
# File 'lib/restpack_serializer/serializable/side_load_data_builder.rb', line 30

def side_load_has_and_belongs_to_many
  has_association_relation do |options|
    join_table_name = @association.join_table
    join_clause = "join #{join_table_name} on #{@association.plural_name}.id = #{join_table_name}.#{@association.class_name.foreign_key}"
    options.scope = options.scope.joins(join_clause)
    association_fk = @association.foreign_key.to_sym
    options.filters = { join_table_name.to_sym => { association_fk => model_ids } }
  end
end

#side_load_has_manyObject



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/restpack_serializer/serializable/side_load_data_builder.rb', line 18

def side_load_has_many
  has_association_relation do |options|
    if join_table = @association.options[:through]
      options.scope = options.scope.joins(join_table).distinct
      association_fk = @association.through_reflection.foreign_key.to_sym
      options.filters = { join_table => { association_fk => model_ids } }
    else
      options.filters = { @association.foreign_key.to_sym => model_ids }
    end
  end
end