diff --git a/app/models/organization.rb b/app/models/organization.rb index 04aea22f3..606bd7b28 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -138,7 +138,8 @@ class Organization < ApplicationRecord def conditionally_update_articles return unless Article::ATTRIBUTES_CACHED_FOR_RELATED_ENTITY.detect { |attr| saved_change_to_attribute?(attr) } - articles.each(&:save) + article_ids = articles.ids.map { |id| [id] } + Organizations::SaveArticleWorker.perform_bulk(article_ids) end def bust_cache diff --git a/app/workers/organizations/save_article_worker.rb b/app/workers/organizations/save_article_worker.rb new file mode 100644 index 000000000..c683c5374 --- /dev/null +++ b/app/workers/organizations/save_article_worker.rb @@ -0,0 +1,11 @@ +module Organizations + class SaveArticleWorker + include Sidekiq::Job + + sidekiq_options queue: :high_priority + + def perform(article_id) + Article.find(article_id).save + end + end +end diff --git a/spec/models/organization_spec.rb b/spec/models/organization_spec.rb index 01841a589..4754cdd1d 100644 --- a/spec/models/organization_spec.rb +++ b/spec/models/organization_spec.rb @@ -273,6 +273,8 @@ RSpec.describe Organization do organization.save! end.to change { organization.reload.profile_image_url } + sidekiq_perform_enqueued_jobs + # I want to collect reloaded versions of the organization's articles so I can see their # cached organization profile image articles_profile_image_urls = organization.articles @@ -304,6 +306,8 @@ RSpec.describe Organization do organization.update(name: "ACME Org") + sidekiq_perform_enqueued_jobs + expect(article.reload.reading_list_document).not_to eq(old_reading_list_document) end diff --git a/spec/services/organizations/delete_spec.rb b/spec/services/organizations/delete_spec.rb index 33a12ccdb..1329c8c37 100644 --- a/spec/services/organizations/delete_spec.rb +++ b/spec/services/organizations/delete_spec.rb @@ -28,6 +28,9 @@ RSpec.describe Organizations::Delete, type: :service do it "removes the organization name from the .reading_list_document after destroy" do org.update(name: "ACME") + + sidekiq_perform_enqueued_jobs + expect(article.reload.reading_list_document).to include("acme") described_class.call(org) diff --git a/spec/workers/organizations/save_article_worker_spec.rb b/spec/workers/organizations/save_article_worker_spec.rb new file mode 100644 index 000000000..4e19a04e1 --- /dev/null +++ b/spec/workers/organizations/save_article_worker_spec.rb @@ -0,0 +1,23 @@ +require "rails_helper" + +RSpec.describe Organizations::SaveArticleWorker do + describe "perform" do + let(:worker) { subject } + let(:organization) { create(:organization) } + let!(:articles) { (1..3).map { |_a| create(:article, organization: organization) } } # rubocop:disable RSpec/LetSetup + + describe "save articles with worker" do + it "on organization slug change" do + new_slug = "newSlug" + organization.update(slug: new_slug) + + sidekiq_perform_enqueued_jobs + + organization.articles.each do |article| + # Articles were updated + expect(article.created_at).not_to eq(article.updated_at) + end + end + end + end +end