Class: ApiMaker::PreloaderHasOne
- Inherits:
-
Object
- Object
- ApiMaker::PreloaderHasOne
- Defined in:
- lib/api_maker/preloader_has_one.rb
Instance Method Summary collapse
- #collection_name ⇒ Object
-
#initialize(ability:, args:, data:, collection:, reflection:, records:, select: @select) ⇒ PreloaderHasOne
constructor
A new instance of PreloaderHasOne.
- #models ⇒ Object
- #origin_data_for_model(model) ⇒ Object
- #preload ⇒ Object
- #query_normal ⇒ Object
- #query_through ⇒ Object
- #resource ⇒ Object
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_name ⇒ Object
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 |
#models ⇒ Object
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 |
#preload ⇒ Object
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_normal ⇒ Object
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_through ⇒ Object
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 |
#resource ⇒ Object
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 |