class AmsLazyRelationships::Loaders::SimpleBelongsTo

Batch loads parent ActiveRecord records for given record by foreign key. Useful when the relationship is not a standard ActiveRecord relationship.

Attributes

association_class_name[R]
foreign_key[R]

Public Class Methods

new( association_class_name, foreign_key: " click to toggle source

@param association_class_name [String] The name of AR class being the parent

record of the records being loaded. E.g. When loading comment.blog_post
it'd be "BlogPost".

@param foreign_key [Symbol/String] Name of the foreign key column

E.g. When loading comment.blog_post it'd be "blog_post_id
# File lib/ams_lazy_relationships/loaders/simple_belongs_to.rb, line 15
def initialize(
  association_class_name,
  foreign_key: "#{association_class_name.underscore}_id"
)
  @association_class_name = association_class_name
  @foreign_key = foreign_key.to_sym
end

Private Instance Methods

batch_key(record) click to toggle source
# File lib/ams_lazy_relationships/loaders/simple_belongs_to.rb, line 49
def batch_key(record)
  "#{record.class}/#{association_class_name}"
end
load_data(records, loader) click to toggle source
# File lib/ams_lazy_relationships/loaders/simple_belongs_to.rb, line 27
def load_data(records, loader)
  data_ids = records.map(&foreign_key).compact.uniq
  data = if data_ids.present?
           association_class_name.constantize.where(id: data_ids)
         else
           []
         end

  resolve(records, data, loader)

  data
end
resolve(records, data, loader) click to toggle source
# File lib/ams_lazy_relationships/loaders/simple_belongs_to.rb, line 40
def resolve(records, data, loader)
  data = data.index_by { |d| d.id.to_s }
  records.each do |r|
    fk_value = r.public_send(foreign_key).to_s
    loaded_item = data[fk_value]
    loader.call(r, loaded_item)
  end
end