diff --git a/lib/jit_preloader/active_record/associations/preloader/ar6_association.rb b/lib/jit_preloader/active_record/associations/preloader/ar6_association.rb index b7bad0d..af62e41 100644 --- a/lib/jit_preloader/active_record/associations/preloader/ar6_association.rb +++ b/lib/jit_preloader/active_record/associations/preloader/ar6_association.rb @@ -22,7 +22,7 @@ def run all_records = [] owners.each do |owner| - owned_records = records_by_owner[owner] || [] + owned_records = records_by_owner[owner]&.uniq || [] all_records.concat(Array(owned_records)) if owner.jit_preloader || JitPreloader.globally_enabled? associate_records_to_owner(owner, owned_records) end diff --git a/spec/lib/jit_preloader/preloader_spec.rb b/spec/lib/jit_preloader/preloader_spec.rb index fe1397b..7dc0980 100644 --- a/spec/lib/jit_preloader/preloader_spec.rb +++ b/spec/lib/jit_preloader/preloader_spec.rb @@ -439,4 +439,23 @@ end end + context "duplicate records" do + let!(:contact1) { Contact.new(name: "1 contact, 1 phone number", phone_numbers: [phone_number]) } + let!(:contact2) { nil } + let!(:contact3) { nil } + let!(:contact_owner) { nil } + + let(:phone_number) { PhoneNumber.new(phone: "123") } + let!(:email_adresses) do + [ + EmailAddress.create!(address: "woot@woot.com", contact: contact1), + EmailAddress.create!(address: "a@a.com", contact: contact1), + ] + end + + it "does not assign duplicate records" do + expect(EmailAddress.jit_preload.to_a.map{|e| e.contact.phone_numbers.length }).to eql([1, 1]) + end + end + end