Skip to content

Instantly share code, notes, and snippets.

@seven1m
Last active August 29, 2015 14:05
Show Gist options
  • Save seven1m/3baf016dbbc597390ddb to your computer and use it in GitHub Desktop.
Save seven1m/3baf016dbbc597390ddb to your computer and use it in GitHub Desktop.
Bug in ActiveRecord where(...).create() -- see https://github.com/rails/rails/issues/16668
require 'active_record'
require 'sqlite3'
require 'rspec'
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: ':memory:'
)
ActiveRecord::Base.logger = Logger.new(STDOUT)
class CreateTables < ActiveRecord::Migration
def up
create_table :folders do |t|
t.integer :their_folder_id
end
create_table :entries do |t|
t.integer :folder_id
t.integer :irrelevant_number
t.integer :their_folder_entry_count
end
end
end
CreateTables.new.up
class Folder < ActiveRecord::Base
has_many :entries
belongs_to :their_folder, class_name: 'Folder'
end
class Entry < ActiveRecord::Base
belongs_to :folder
before_create do
if folder.their_folder
self.their_folder_entry_count = folder.their_folder.entries.count
end
end
end
describe Folder do
before do
@their_folder = Folder.create
@their_entries = (1..3).map { @their_folder.entries.create }
@my_folder = Folder.create(their_folder: @their_folder)
end
context 'create without relation' do
before do
@entry = @my_folder.entries.create(irrelevant_number: 0)
# SQL issued to get their_folder_count:
# => SELECT COUNT(*) FROM "entries" WHERE "entries"."folder_id" = 1
end
it 'sets their_folder_entry_count to the correct number' do
expect(@entry.their_folder_entry_count).to eq(3)
end
end
context 'create with relation' do
before do
@entry = @my_folder.entries.where(irrelevant_number: 0).create
# SQL issued to get their_folder_count:
# => SELECT COUNT(*) FROM "entries" WHERE "entries"."irrelevant_number" = 0 AND "entries"."folder_id" = 3
end
it 'sets their_folder_entry_count to the correct number' do
expect(@entry.their_folder_entry_count).to eq(3)
# this fails with:
# 1) Folder#create sets their_folder_entry_count to the correct number
# Failure/Error: expect(@entry.their_folder_entry_count).to eq(3)
#
# expected: 3
# got: 0
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment