Module: BatchLoaderActiveRecord::ClassMethods
- Defined in:
- lib/batch_loader_active_record.rb
Instance Method Summary collapse
Instance Method Details
#belongs_to_lazy(*args) ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/batch_loader_active_record.rb', line 12 def belongs_to_lazy(*args) belongs_to(*args).tap do |reflections| assoc = reflections.values.last batch_key = [table_name, assoc.name] define_method(:"#{assoc.name}_lazy") do foreign_key_value = send(assoc.foreign_key) or return nil BatchLoader.for(foreign_key_value).batch(key: batch_key) do |foreign_key_values, loader| assoc.klass.where(id: foreign_key_values).each { |instance| loader.call(instance.id, instance) } end end end end |
#has_many_lazy(*args) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/batch_loader_active_record.rb', line 39 def has_many_lazy(*args) has_many(*args).tap do |reflections| assoc = reflections.values.last batch_key = [table_name, assoc.name] define_method(:"#{assoc.name}_lazy") do BatchLoader.for(id).batch(default_value: [], key: batch_key) do |model_ids, loader| assoc.klass.where(assoc.foreign_key => model_ids).each do |instance| loader.call(instance.public_send(assoc.foreign_key)) { |value| value << instance } end end end end end |
#has_one_lazy(*args) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/batch_loader_active_record.rb', line 25 def has_one_lazy(*args) has_one(*args).tap do |reflections| assoc = reflections.values.last batch_key = [table_name, assoc.name] define_method(:"#{assoc.name}_lazy") do BatchLoader.for(id).batch(key: batch_key) do |model_ids, loader| assoc.klass.where(assoc.foreign_key => model_ids).each do |instance| loader.call(instance.public_send(assoc.foreign_key), instance) end end end end end |