Skip to content

Instantly share code, notes, and snippets.

@jrafanie
Last active February 24, 2016 04:38
Show Gist options
  • Save jrafanie/083fff24b2c1532d2545 to your computer and use it in GitHub Desktop.
Save jrafanie/083fff24b2c1532d2545 to your computer and use it in GitHub Desktop.
Uniqueness with an after_create that saves fails on rails master
begin
require 'bundler/inline'
rescue LoadError => e
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
raise e
end
gemfile(true) do
source 'https://rubygems.org'
gem 'rails', github: 'rails/rails'
gem 'arel', github: 'rails/arel'
gem 'rack', github: 'rack/rack'
gem 'sprockets', github: 'rails/sprockets'
gem 'sprockets-rails', github: 'rails/sprockets-rails'
gem 'sass-rails', github: 'rails/sass-rails'
gem 'sqlite3'
end
require 'active_record'
require 'logger'
# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Schema.define do
create_table :topics, force: true do |t|
t.string :title
t.string :author_name
end
end
class Topic < ActiveRecord::Base
validates :title, :uniqueness => true
after_create :set_author
def set_author
update_attributes!(:author_name => "#{title} #{id}")
end
end
Topic.create!(:title => "test")
Fetching git://github.com/rails/rails.git
Fetching git://github.com/rails/arel.git
Fetching git://github.com/rack/rack.git
Fetching git://github.com/rails/sprockets.git
Fetching git://github.com/rails/sprockets-rails.git
Fetching git://github.com/rails/sass-rails.git
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...
Using rake 10.5.0
Using concurrent-ruby 1.0.0
Using i18n 0.7.0
Using minitest 5.8.4
Using thread_safe 0.3.5
Using builder 3.2.2
Using erubis 2.7.0
Using mini_portile2 2.0.0
Using json 1.8.3
Using nio4r 1.2.1
Using websocket-extensions 0.1.2
Using mime-types 2.99.1
Using arel 7.0.0 from git://github.com/rails/arel.git (at master@1beac5b)
Using bundler 1.11.2
Using method_source 0.8.2
Using thor 0.19.1
Using sass 3.4.21
Using sqlite3 1.3.11
Using tzinfo 1.2.2
Using nokogiri 1.6.7.2
Using rack 2.0.0.alpha from git://github.com/rack/rack.git (at master@ea2ed57)
Using websocket-driver 0.6.3
Using mail 2.6.3
Using activesupport 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using loofah 2.0.3
Using rails-html-sanitizer 1.0.3
Using rack-test 0.6.3
Using sprockets 4.0.0.beta2 from git://github.com/rails/sprockets.git (at master@4205b6d)
Using rails-deprecated_sanitizer 1.0.3
Using globalid 0.3.6
Using activemodel 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using rails-dom-testing 1.0.7
Using activejob 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using actionview 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using activerecord 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using actionpack 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using actioncable 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using actionmailer 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using railties 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using sprockets-rails 3.0.2 from git://github.com/rails/sprockets-rails.git (at master@907cf04)
Using rails 5.0.0.beta2 from git://github.com/rails/rails.git (at master@22db455)
Using sass-rails 6.0.0.beta1 from git://github.com/rails/sass-rails.git (at master@2890796)
-- create_table(:topics, {:force=>true})
D, [2016-02-23T23:33:58.893552 #21061] DEBUG -- : (0.2ms) CREATE TABLE "topics" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "author_name" varchar)
-> 0.0193s
D, [2016-02-23T23:33:58.897230 #21061] DEBUG -- : (0.2ms) CREATE TABLE "ar_internal_metadata" ("key" varchar PRIMARY KEY, "value" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
D, [2016-02-23T23:33:58.904126 #21061] DEBUG -- : ActiveRecord::InternalMetadata Load (0.1ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" ORDER BY "ar_internal_metadata"."key" ASC LIMIT ? [["LIMIT", 1]]
D, [2016-02-23T23:33:58.909791 #21061] DEBUG -- : (0.0ms) begin transaction
D, [2016-02-23T23:33:58.910807 #21061] DEBUG -- : SQL (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["key", "environment"], ["value", "development"], ["created_at", 2016-02-24 04:33:58 UTC], ["updated_at", 2016-02-24 04:33:58 UTC]]
D, [2016-02-23T23:33:58.910958 #21061] DEBUG -- : (0.0ms) commit transaction
D, [2016-02-23T23:33:58.914560 #21061] DEBUG -- : (0.1ms) begin transaction
D, [2016-02-23T23:33:58.920210 #21061] DEBUG -- : Topic Exists (0.1ms) SELECT 1 AS one FROM "topics" WHERE "topics"."title" = ? LIMIT ? [["title", "test"], ["LIMIT", 1]]
D, [2016-02-23T23:33:58.921652 #21061] DEBUG -- : SQL (0.1ms) INSERT INTO "topics" ("title") VALUES (?) [["title", "test"]]
D, [2016-02-23T23:33:58.922889 #21061] DEBUG -- : Topic Exists (0.1ms) SELECT 1 AS one FROM "topics" WHERE "topics"."title" = ? AND ("topics"."id" IS NOT NULL) LIMIT ? [["title", "test"], ["LIMIT", 1]]
D, [2016-02-23T23:33:58.934851 #21061] DEBUG -- : (0.1ms) rollback transaction
/Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/validations.rb:78:in `raise_validation_error': Validation failed: Title has already been taken (ActiveRecord::RecordInvalid)
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/validations.rb:50:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:324:in `block in save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:228:in `transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:211:in `transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:324:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/persistence.rb:279:in `block in update!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:228:in `transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:211:in `transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/persistence.rb:277:in `update!'
from recreation_script.rb:38:in `set_author'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:382:in `block in make_lambda'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:207:in `call'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:207:in `block in halting_and_conditional'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:456:in `call'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:456:in `block in call'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:456:in `each'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:456:in `call'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:101:in `__run_callbacks__'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:750:in `_run_create_callbacks'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/callbacks.rb:302:in `_create_record'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/timestamp.rb:68:in `_create_record'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/persistence.rb:534:in `create_or_update'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/callbacks.rb:298:in `block in create_or_update'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activesupport/lib/active_support/callbacks.rb:750:in `_run_save_callbacks'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/callbacks.rb:298:in `create_or_update'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/suppressor.rb:41:in `create_or_update'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/persistence.rb:152:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/validations.rb:50:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:324:in `block in save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `block in transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:211:in `transaction'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/transactions.rb:324:in `save!'
from /Users/joerafaniello/.gem/ruby/2.2.4/bundler/gems/rails-22db455dbe9c/activerecord/lib/active_record/persistence.rb:51:in `create!'
from recreation_script.rb:42:in `<main>'
# Below is a test you can run within the existing uniqueness_validation_test.rb
require "cases/helper"
require 'models/topic'
class NewTopic < Topic
after_create :set_author
def set_author
update_attributes!(:author_name => "#{title} #{id}")
end
end
class UniquenessValidationTest2 < ActiveRecord::TestCase
def test_validate_case_sensitive_uniqueness_with_attribute_passed_as_integer2
NewTopic.validates_uniqueness_of(:title)
NewTopic.create!(:title => "Title1")
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment