Module: ActiveRecordCustomPreloader::RelationPatch

Extended by:
ActiveSupport::Concern
Defined in:
lib/active_record_custom_preloader/relation_patch.rb

Instance Method Summary collapse

Instance Method Details

#custom_preload(*names) ⇒ Object

custom preload with optional args usage:

class IncomingStatisticPreloader < ActiveRecordCustomPreloader::Preloader
  def preload(records)
    StatsApi.fetch(:incoming, group_by: args.fetch(:group_by))
  end
end

class OutgoingStatisticPreloader < ActiveRecordCustomPreloader::Preloader
  def preload(records)
    ids = records.map(&:id)
    api_result = StatsApi.fetch(:incoming, person_ids: ids, group: args.fetch(:group))
    values = api_result.group_by(&:person_id)
    records.each do |record|
      value = values[record.id] || []
      record._set_custom_preloaded_value(name, value)
    end
  end
end

class Person < ActiveRecord::Base
  add_loader :_incoming_stats, class_name: 'IncomingStatisticPreloader'
  add_loader :_outgoing_stats, class_name: 'OutgoingStatisticPreloader'
end

Person.limit(10).custom_preload(:_incoming_stats, :_outgoing_stats, group: 'hour')
# is syntax sugar for
Person.limit(10).preload(
    ActiveRecordCustomPreloader::PreloadWithOptions.new(:_incoming_stats, group: 'hour'),
    ActiveRecordCustomPreloader::PreloadWithOptions.new(:_outgoing_stats, group: 'hour')
)


49
50
51
52
53
# File 'lib/active_record_custom_preloader/relation_patch.rb', line 49

def custom_preload(*names)
  args = names.extract_options!
  preloads = names.map { |name| PreloadWithOptions.new(name, args) }
  preload(*preloads)
end