Module: ActiveRecordCustomPreloader::WithArrayForeignKeysLoading

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

Instance Method Summary collapse

Instance Method Details

#associations_by_parent_record(parent_record, association_records) ⇒ Object

returns associations for provided parent_record. array for has_many and model or nil for has_one.



46
47
48
49
50
51
52
# File 'lib/active_record_custom_preloader/with_array_foreign_keys_loading.rb', line 46

def associations_by_parent_record(parent_record, association_records)
  ids = parent_record.public_send(association_foreign_keys_name)
  return [] if ids.nil? || ids.empty?
  result = association_records.select { |r| ids.include?(r.id) }
  result.sort_by! { |r| ids.index r.id } if keep_sorting
  result
end

#associations_scopeObject

default scope for association records. you can override it for example to preload some values to association records.



61
62
63
# File 'lib/active_record_custom_preloader/with_array_foreign_keys_loading.rb', line 61

def associations_scope
  model_class_name.constantize.all
end

#fetch_association(parent_records) ⇒ Object



54
55
56
57
# File 'lib/active_record_custom_preloader/with_array_foreign_keys_loading.rb', line 54

def fetch_association(parent_records)
  ids = parent_records.map(&association_foreign_keys_name).flatten.uniq.compact
  associations_scope.where(id: ids).to_a
end

#preload(parent_records) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/active_record_custom_preloader/with_array_foreign_keys_loading.rb', line 65

def preload(parent_records)
  association_records = fetch_association(parent_records)
  parent_records.each do |parent_record|
    value = associations_by_parent_record(parent_record, association_records)
    parent_record._set_custom_preloaded_value(name, value)
  end
end