Instead of counting the associated records in the database every time, ActiveRecord’s counter caching feature allows storing the counter and updating it every time an associated object is created or removed.
In Rails apps you can set your counter cache option for association with simple code.
This means, what you need to have authors_count integer column in your model related table.
Adding counter cache to your model
class Campaign belongs_to :author, counter_cache: true end
Let’s generate a database migration.
$ rails generate migration AddCampaignsCountToAuthors campaigns_count:integer invoke active_record create db/migrate/20190618093257_add_campaigns_count_to_authors.rb $ rake db:migrate == 20190618093257 AddCampaignsCountToAuthors: migrating ====================== -- add_column(:authors, :campaigns_count, :integer) -> 0.0016s == 20190618093257 AddCampaignsCountToAuthors: migrated (0.0017s) =============
Populating the counter cache
Usually you already have some code / data, and all what you need - recount numbers in database. You can do that with simple rake task.
namespace :caching do desc "Update counter cache" task gencache: :environment do Author.find_each do |author| Author.reset_counters(author.id, :campaigns) end end end