class ApiMaker::PreloaderHasOne

Public Class Methods

new(ability:, args:, data:, collection:, reflection:, records:, select: @select) click to toggle source
# 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

Public Instance Methods

collection_name() click to toggle source
# 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
models() click to toggle source
# 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) click to toggle source
# 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
preload() click to toggle source
# 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_normal() click to toggle source
# 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_through() click to toggle source
# 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
resource() click to toggle source
# File lib/api_maker/preloader_has_one.rb, line 67
def resource
  @resource ||= ApiMaker::MemoryStorage.current.resource_for_model(@reflection.klass)
end