Module: ActiveRecordCustomPreloader::WithArrayForeignKeysLoading
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/active_record_custom_preloader/with_array_foreign_keys_loading.rb
Instance Method Summary collapse
-
#associations_by_parent_record(parent_record, association_records) ⇒ Object
returns associations for provided parent_record.
-
#associations_scope ⇒ Object
default scope for association records.
- #fetch_association(parent_records) ⇒ Object
- #preload(parent_records) ⇒ Object
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_scope ⇒ Object
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 |