diff --git a/app/models/post_visibility.rb b/app/models/post_visibility.rb index 77a72f322..b199a64d9 100644 --- a/app/models/post_visibility.rb +++ b/app/models/post_visibility.rb @@ -12,16 +12,16 @@ class PostVisibility < ActiveRecord::Base # @param contacts [Array] Recipients # @param post [Post] # @return [void] - def self.batch_import(contacts, post) + def self.batch_import(contacts_ids, post) if postgres? - contacts.each do |contact| + contacts_ids.each do |contact_id| PostVisibility.find_or_create_by_contact_id_and_post_id(contact.id, post.id) end else - new_post_visibilities = contacts.map do |contact| - PostVisibility.new(:contact_id => contact.id, :post_id => post.id) + new_post_visibilities_data = contacts_ids.map do |contact_id| + [contact_id, post.id] end - PostVisibility.import(new_post_visibilities) + PostVisibility.import([:contact_id, :post_id], new_post_visibilities_data) end end end diff --git a/lib/postzord/receiver/local_batch.rb b/lib/postzord/receiver/local_batch.rb index 361989f45..121f04fa9 100644 --- a/lib/postzord/receiver/local_batch.rb +++ b/lib/postzord/receiver/local_batch.rb @@ -36,8 +36,8 @@ module Postzord # @note performs a bulk insert into mySQL # @return [void] def create_post_visibilities - contacts = Contact.where(:user_id => @recipient_user_ids, :person_id => @object.author_id) - PostVisibility.batch_import(contacts, object) + contacts_ids = Contact.connection.select_values(Contact.where(:user_id => @recipient_user_ids, :person_id => @object.author_id).select("id").to_sql) + PostVisibility.batch_import(contacts_ids, object) end # Notify any mentioned users within the @object's text diff --git a/spec/lib/postzord/receiver/local_batch_spec.rb b/spec/lib/postzord/receiver/local_batch_spec.rb index 5e1a10867..991826278 100644 --- a/spec/lib/postzord/receiver/local_batch_spec.rb +++ b/spec/lib/postzord/receiver/local_batch_spec.rb @@ -41,7 +41,7 @@ describe Postzord::Receiver::LocalBatch do describe '#create_post_visibilities' do it 'calls Postvisibility.batch_import with hashes' do - PostVisibility.should_receive(:batch_import).with([{:id => bob.contact_for(alice.person).id}], @object) + PostVisibility.should_receive(:batch_import).with([bob.contact_for(alice.person).id], @object) receiver.create_post_visibilities end end diff --git a/spec/models/post_visibility_spec.rb b/spec/models/post_visibility_spec.rb index 3fec3aff3..e35470e67 100644 --- a/spec/models/post_visibility_spec.rb +++ b/spec/models/post_visibility_spec.rb @@ -13,7 +13,7 @@ describe PostVisibility do it 'creates a visibility for each user' do lambda { - PostVisibility.batch_import([@contact], @post) + PostVisibility.batch_import([@contact.id], @post) }.should change { PostVisibility.exists?(:contact_id => @contact.id, :post_id => @post.id) }.from(false).to(true) @@ -22,7 +22,7 @@ describe PostVisibility do it 'does not raise if a visibility already exists' do PostVisibility.create!(:contact_id => @contact.id, :post_id => @post.id) lambda { - PostVisibility.batch_import([@contact], @post) + PostVisibility.batch_import([@contact.id], @post) }.should_not raise_error end end