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