Skip to content

Instantly share code, notes, and snippets.

@jrafanie
Last active May 31, 2016 21:09
Show Gist options
  • Save jrafanie/a0731271a76df3a6c35742673d4f04b0 to your computer and use it in GitHub Desktop.
Save jrafanie/a0731271a76df3a6c35742673d4f04b0 to your computer and use it in GitHub Desktop.
Rails 5.0.0.rc1 throws NotImplementedError on update if select is missing target column or updated_* columns
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', '5.0.0.rc1'
# gem 'rails', '4.2.6'
gem 'sqlite3'
end
require 'active_record'
require 'logger'
require 'minitest/autorun'
# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Schema.define do
create_table :people, force: true do |t|
t.string :name
t.string :color
t.datetime :created_on
t.datetime :updated_on
end
end
class Person < ActiveRecord::Base
end
class JoeTest < ActiveSupport::TestCase
def setup
Person.create!(name: 'Joe')
end
def test_update_for_unselected_column
person = Person.where(name: 'Joe').select(:id, :name).first
# 5.0.0.rc1: Raises NotImplementedError since color isn't in the select
assert_nothing_raised { person.update(color: 'blue') }
assert_equal 'blue', Person.find(person.id).color
end
def test_update_for_selected_column
person = Person.where(name: 'Joe').select(:id, :name, :color).first
# 5.0.0.rc1: Raises NotImplementedError since updated_on isn't in the select
# Note: this test passes randomly depending on test order
assert_nothing_raised { person.update(color: 'blue') }
assert_equal 'blue', Person.find(person.id).color
end
def test_update_without_select
person = Person.where(name: 'Joe').first
assert_nothing_raised { person.update(color: 'blue') }
assert_equal 'blue', Person.find(person.id).color
end
end
05:04:24 ~/Code (2.2.5) + ruby rails_test.rb
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 11.1.2
Using i18n 0.7.0
Using json 1.8.3
Using minitest 5.9.0
Using thread_safe 0.3.5
Using builder 3.2.2
Using erubis 2.7.0
Using mini_portile2 2.0.0
Using rack 1.6.4
Using mime-types-data 3.2016.0521
Using arel 6.0.3
Using bundler 1.12.5
Using concurrent-ruby 1.0.2
Using thor 0.19.1
Using sqlite3 1.3.11
Using tzinfo 1.2.2
Using nokogiri 1.6.7.2
Using rack-test 0.6.3
Using mime-types 3.1
Using sprockets 3.6.0
Using activesupport 4.2.6
Using loofah 2.0.3
Using mail 2.6.4
Using rails-deprecated_sanitizer 1.0.3
Using globalid 0.3.6
Using activemodel 4.2.6
Using rails-html-sanitizer 1.0.3
Using rails-dom-testing 1.0.7
Using activejob 4.2.6
Using activerecord 4.2.6
Using actionview 4.2.6
Using actionpack 4.2.6
Using actionmailer 4.2.6
Using railties 4.2.6
Using sprockets-rails 3.0.4
Using rails 4.2.6
-- create_table(:people, {:force=>true})
-> 0.0024s
Run options: --seed 6364
# Running:
DEPRECATION WARNING: You did not specify a value for the configuration option `active_support.test_order`. In Rails 5, the default value of this option will change from `:sorted` to `:random`.
To disable this warning and keep the current behavior, you can add the following line to your `config/environments/test.rb`:
Rails.application.configure do
config.active_support.test_order = :sorted
end
Alternatively, you can opt into the future behavior by setting this option to `:random`. (called from test_order at /Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-4.2.6/lib/active_support/test_case.rb:42)
...
Finished in 0.018989s, 157.9882 runs/s, 157.9882 assertions/s.
3 runs, 3 assertions, 0 failures, 0 errors, 0 skips
05:05:32 ~/Code (2.2.5) - ruby rails_test.rb
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 11.1.2
Using concurrent-ruby 1.0.2
Using i18n 0.7.0
Using minitest 5.9.0
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-data 3.2016.0521
Using arel 7.0.0
Using bundler 1.12.5
Using method_source 0.8.2
Using thor 0.19.1
Using sqlite3 1.3.11
Using tzinfo 1.2.2
Using nokogiri 1.6.7.2
Using rack 2.0.0.rc1
Using websocket-driver 0.6.4
Using mime-types 3.1
Using activesupport 5.0.0.rc1
Using loofah 2.0.3
Using rack-test 0.6.3
Using sprockets 3.6.0
Using mail 2.6.4
Using rails-deprecated_sanitizer 1.0.3
Using globalid 0.3.6
Using activemodel 5.0.0.rc1
Using rails-html-sanitizer 1.0.3
Using rails-dom-testing 1.0.7
Using activejob 5.0.0.rc1
Using activerecord 5.0.0.rc1
Using actionview 5.0.0.rc1
Using actionpack 5.0.0.rc1
Using actioncable 5.0.0.rc1
Using actionmailer 5.0.0.rc1
Using railties 5.0.0.rc1
Using sprockets-rails 3.0.4
Using rails 5.0.0.rc1
-- create_table(:people, {:force=>true})
-> 0.0141s
Run options: --seed 21191
# Running:
EE.
Finished in 0.011674s, 256.9830 runs/s, 85.6610 assertions/s.
1) Error:
JoeTest#test_update_for_selected_column:
NotImplementedError: NotImplementedError
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:84:in `type_cast'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:46:in `original_value'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:44:in `original_value'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:123:in `changed_from_assignment?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:55:in `changed?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:25:in `changed?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:9:in `block in changed_values'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:8:in `each'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:8:in `each_with_object'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:8:in `changed_values'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_methods/dirty.rb:83:in `changed_attributes'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activemodel-5.0.0.rc1/lib/active_model/dirty.rb:146:in `changed'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_methods/dirty.rb:127:in `keys_for_partial_write'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_methods/dirty.rb:119:in `_update_record'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/callbacks.rb:306:in `block in _update_record'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/callbacks.rb:750:in `_run_update_callbacks'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/callbacks.rb:306:in `_update_record'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/timestamp.rb:81:in `_update_record'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:534:in `create_or_update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/callbacks.rb:298:in `block in create_or_update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/callbacks.rb:750:in `_run_save_callbacks'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/callbacks.rb:298:in `create_or_update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:125:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/validations.rb:44:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_methods/dirty.rb:22:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:319:in `block (2 levels) in save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:319:in `block in save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:318:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/suppressor.rb:41:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:266:in `block in update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:264:in `update'
rails_test.rb:52:in `block in test_update_for_selected_column'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/test_case.rb:83:in `assert_nothing_raised'
rails_test.rb:52:in `test_update_for_selected_column'
2) Error:
JoeTest#test_update_for_unselected_column:
NotImplementedError: NotImplementedError
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:84:in `type_cast'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:46:in `original_value'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:44:in `original_value'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:123:in `changed_from_assignment?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute.rb:55:in `changed?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:25:in `changed?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:9:in `block in changed_values'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:8:in `each'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:8:in `each_with_object'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_mutation_tracker.rb:8:in `changed_values'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_methods/dirty.rb:83:in `changed_attributes'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activemodel-5.0.0.rc1/lib/active_model/dirty.rb:137:in `changed?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/timestamp.rb:85:in `should_record_timestamps?'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/timestamp.rb:72:in `_update_record'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:534:in `create_or_update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/callbacks.rb:298:in `block in create_or_update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/callbacks.rb:750:in `_run_save_callbacks'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/callbacks.rb:298:in `create_or_update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:125:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/validations.rb:44:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/attribute_methods/dirty.rb:22:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:319:in `block (2 levels) in save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:319:in `block in save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:318:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/suppressor.rb:41:in `save'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:266:in `block in update'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activerecord-5.0.0.rc1/lib/active_record/persistence.rb:264:in `update'
rails_test.rb:43:in `block in test_update_for_unselected_column'
/Users/joerafaniello/.gem/ruby/2.2.5/gems/activesupport-5.0.0.rc1/lib/active_support/test_case.rb:83:in `assert_nothing_raised'
rails_test.rb:43:in `test_update_for_unselected_column'
3 runs, 1 assertions, 0 failures, 2 errors, 0 skips
05:05:44 ~/Code (2.2.5) -
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment