Skip to content

Instantly share code, notes, and snippets.

@tmeasday
Created December 8, 2011 08:08
Show Gist options
  • Save tmeasday/1446430 to your computer and use it in GitHub Desktop.
Save tmeasday/1446430 to your computer and use it in GitHub Desktop.
Problem with has_many :through counter_caches
require 'rubygems'
require 'active_record'
# Print out what version we're running
puts "Active Record #{ActiveRecord::VERSION::STRING}"
# Connect to an in-memory sqlite3 database
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => ':memory:'
)
# Create the minimal database schema necessary to reproduce the bug
ActiveRecord::Schema.define do
create_table :users, :force => true do |t|
t.integer :projects_count, :default => 0
end
create_table :projects, :force => true do |t|
t.integer :users_count, :default => 0
end
create_table :memberships, :force => true do |t|
t.integer :user_id
t.integer :project_id
end
end
# define the models
class User < ActiveRecord::Base
has_many :memberships
has_many :projects, :through => :memberships
end
class Project < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :project
end
### Here's the bugs:
user = User.create
project = Project.create
puts "Initially:"
puts "User's projects_count is #{user.projects_count}"
puts "Projects's users_count is #{project.users_count}"
user.projects << project
puts "After adding the project once:"
puts "User's projects_count is #{user.projects_count}"
puts "Projects's users_count is #{project.users_count}"
user.projects << project
puts "After adding the project a second time:"
puts "User's projects_count is #{user.projects_count}"
puts "Projects's users_count is #{project.users_count}"
@tmeasday
Copy link
Author

tmeasday commented Dec 8, 2011

Output is:

Active Record 3.1.3
-- create_table(:users, {:force=>true})
   -> 0.0417s
-- create_table(:projects, {:force=>true})
   -> 0.0005s
-- create_table(:memberships, {:force=>true})
   -> 0.0004s
Initially:
User's projects_count is 0
Projects's users_count is 0
After adding the project once:
User's projects_count is 1
Projects's users_count is 0
After adding the project a second time:
User's projects_count is 2
Projects's users_count is 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment