Class: ApiMaker::PreloaderHasOne

Inherits:
Object
  • Object
show all
Defined in:
lib/api_maker/preloader_has_one.rb

Instance Method Summary collapse

Constructor Details

#initialize(ability:, args:, data:, collection:, reflection:, records:, select: @select) ⇒ PreloaderHasOne

Returns a new instance of PreloaderHasOne.



2
3
4
5
6
7
8
9
10
11
12
# File 'lib/api_maker/preloader_has_one.rb', line 2

def initialize(ability:, args:, data:, collection:, reflection:, records:, select: @select)
  @ability = ability
  @args = args
  @data = data
  @collection = collection
  @reflection = reflection
  @records = records
  @select = select

  raise "Records was nil" unless records
end

Instance Method Details

#collection_nameObject



14
15
16
# File 'lib/api_maker/preloader_has_one.rb', line 14

def collection_name
  @collection_name ||= ApiMaker::MemoryStorage.current.resource_for_model(@reflection.active_record).collection_name
end

#modelsObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/api_maker/preloader_has_one.rb', line 35

def models
  @models ||= begin
    if @reflection.is_a?(ActiveRecord::Reflection::ThroughReflection)
      query = query_through
    else
      query = query_normal
    end

    query = query.accessible_by(@ability) if @ability
    query = query.fix
    query.load
    query
  end
end

#origin_data_for_model(model) ⇒ Object



50
51
52
53
# File 'lib/api_maker/preloader_has_one.rb', line 50

def origin_data_for_model(model)
  origin_id = model.read_attribute("api_maker_origin_id")
  @data.fetch(:included).fetch(collection_name).fetch(origin_id)
end

#preloadObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/api_maker/preloader_has_one.rb', line 18

def preload
  models.each do |model|
    ApiMaker::Configuration.profile("Preloading #{model.class.name}##{model.id}") do
      origin_data = origin_data_for_model(model)
      origin_data.fetch(:r)[@reflection.name] = model.id

      serializer = ApiMaker::Serializer.new(ability: @ability, args: @args, model: model, select: @select&.dig(model.class))
      collection_name = serializer.resource.collection_name

      @data.fetch(:included)[collection_name] ||= {}
      @data.fetch(:included).fetch(collection_name)[model.id] ||= serializer
    end
  end

  {collection: models}
end

#query_normalObject



61
62
63
64
65
# File 'lib/api_maker/preloader_has_one.rb', line 61

def query_normal
  @reflection.klass.where(@reflection.foreign_key => @collection.map(&:id))
    .select(@reflection.klass.arel_table[Arel.star])
    .select(@reflection.klass.arel_table[@reflection.foreign_key].as("api_maker_origin_id"))
end

#query_throughObject



55
56
57
58
59
# File 'lib/api_maker/preloader_has_one.rb', line 55

def query_through
  ApiMaker::PreloaderThrough.new(collection: @collection, reflection: @reflection).models_query_through_reflection
    .select(@reflection.klass.arel_table[Arel.star])
    .select(@reflection.active_record.arel_table[@reflection.active_record.primary_key].as("api_maker_origin_id"))
end

#resourceObject



67
68
69
# File 'lib/api_maker/preloader_has_one.rb', line 67

def resource
  @resource ||= ApiMaker::MemoryStorage.current.resource_for_model(@reflection.klass)
end