class ApiMaker::PreloaderBelongsTo

Public Class Methods

new(ability:, args:, data:, collection:, records:, reflection:, select:) click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 2
def initialize(ability:, args:, data:, collection:, records:, reflection:, select:)
  @ability = ability
  @args = args
  @data = data
  @collection = collection
  @reflection = reflection
  @reflection_name = @reflection.name
  @records = records
  @select = select
end

Public Instance Methods

preload() click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 13
def preload
  models.each do |model|
    records_for_model(model).each do |record|
      record.relationships[@reflection_name] = model.id
    end

    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

  {collection: models}
end

Private Instance Methods

collection_name() click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 31
def collection_name
  @collection_name = ApiMaker::MemoryStorage.current.resource_for_model(@reflection.active_record).collection_name
end
look_up_key() click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 48
def look_up_key
  @look_up_key ||= @reflection.options[:primary_key] || @reflection.klass.primary_key
end
model_class() click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 35
def model_class
  @model_class ||= @reflection.klass
end
models() click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 39
def models
  @models ||= begin
    models = @reflection.klass.where(look_up_key => @collection.map(&@reflection.foreign_key.to_sym).uniq)
    models = models.accessible_by(@ability) if @ability
    models.load
    models
  end
end
records_for_model(model) click to toggle source
# File lib/api_maker/preloader_belongs_to.rb, line 52
def records_for_model(model)
  @records
    .fetch(collection_name)
    .values
    .select { |record| record.model.read_attribute(@reflection.foreign_key) == model.read_attribute(look_up_key) }
end