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