lib/torque/postgresql/associations/preloader/association.rb in torque-postgresql-1.1.8 vs lib/torque/postgresql/associations/preloader/association.rb in torque-postgresql-2.0.0

- old
+ new

@@ -6,36 +6,35 @@ delegate :connected_through_array?, to: :@reflection # For reflections connected through an array, make sure to properly # decuple the list of ids and set them as associated with the owner - def run(preloader) + def run return super unless connected_through_array? send("run_array_for_#{@reflection.macro}") end private # Specific run for belongs_many association def run_array_for_belongs_to_many # Add reverse to has_many - records = load_records + records = groupped_records owners.each do |owner| items = records.values_at(*Array.wrap(owner[owner_key_name])) associate_records_to_owner(owner, items.flatten) end end # Specific run for has_many association def run_array_for_has_many # Add reverse to belongs_to_many records = Hash.new { |h, k| h[k] = [] } - load_records.each do |ids, record| + groupped_records.each do |ids, record| ids.each { |id| records[id].concat(Array.wrap(record)) } end - records.default_proc = nil owners.each do |owner| associate_records_to_owner(owner, records[owner[owner_key_name]] || []) end end @@ -46,17 +45,21 @@ condition = scope.arel_attribute(association_key_name) condition = reflection.build_id_constraint(condition, ids.flatten.uniq) scope.where(condition).load(&block) end - unless Torque::PostgreSQL::AR521 - def associate_records_to_owner(owner, records) - association = owner.association(reflection.name) - association.loaded! - association.target.concat(records) - end + def associate_records_to_owner(owner, records) + return super unless connected_through_array? + association = owner.association(reflection.name) + association.loaded! + association.target.concat(records) end + def groupped_records + preloaded_records.group_by do |record| + convert_key(record[association_key_name]) + end + end end ::ActiveRecord::Associations::Preloader::Association.prepend(Association) end end