Skip to content

Instantly share code, notes, and snippets.

@jrafanie
Last active May 31, 2016 17:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jrafanie/1b8d1c40eb9976840801443b70d8f92c to your computer and use it in GitHub Desktop.
Save jrafanie/1b8d1c40eb9976840801443b70d8f92c to your computer and use it in GitHub Desktop.
Rails 5 raises NotImplementedError without updated_on, updated_at, and "the column you want to update" if you call .update
require 'cases/helper'
require 'models/parrot'
# create_table :parrots, force: true do |t|
# t.column :name, :string
# t.column :color, :string
# t.column :parrot_sti_class, :string
# t.column :killer_id, :integer
# if subsecond_precision_supported?
# t.column :created_at, :datetime, precision: 0
# t.column :created_on, :datetime, precision: 0
# t.column :updated_at, :datetime, precision: 0
# t.column :updated_on, :datetime, precision: 0
# else
# t.column :created_at, :datetime
# t.column :created_on, :datetime
# t.column :updated_at, :datetime
# t.column :updated_on, :datetime
# end
# end
class JoeTest < ActiveRecord::TestCase
def setup
Parrot.create!(name: 'Joe')
end
def test_update_for_unselected_column
parrot = Parrot.where(name: 'Joe').select(:name).first
parrot.update(color: 'blue')
assert_equal 'blue', Parrot.first.color
end
def test_update_for_selected_column
parrot = Parrot.where(name: 'Joe').select(:name, :color).first
parrot.update(color: 'blue')
assert_equal 'blue', Parrot.first.color
end
def test_update_for_selected_column_and_updated_on
parrot = Parrot.where(name: 'Joe').select(:name, :color, :updated_on).first
parrot.update(color: 'blue')
assert_equal 'blue', Parrot.first.color
end
def test_update_for_selected_column_and_updated_on_and_updated_at
parrot = Parrot.where(name: 'Joe').select(:name, :color, :updated_on, :updated_at).first
parrot.update(color: 'blue')
assert_equal 'blue', Parrot.first.color
end
def test_update_without_select
parrot = Parrot.where(name: "Joe").first
parrot.update(color: 'blue')
assert_equal 'blue', Parrot.first.color
end
end
01:24:54 ~/Code/rails/activerecord (4-2-stable) (2.2.5) + ARCONN=postgresql bundle exec ruby -Itest /Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb
Using postgresql
Run options: --seed 18273
# Running:
FFFF.
Finished in 0.067897s, 73.6410 runs/s, 73.6410 assertions/s.
1) Failure:
JoeTest#test_update_for_selected_column [/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:36]:
Expected: "blue"
Actual: nil
2) Failure:
JoeTest#test_update_for_selected_column_and_updated_on [/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:42]:
Expected: "blue"
Actual: nil
3) Failure:
JoeTest#test_update_for_selected_column_and_updated_on_and_updated_at [/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:48]:
Expected: "blue"
Actual: nil
4) Failure:
JoeTest#test_update_for_unselected_column [/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:30]:
Expected: "blue"
Actual: nil
5 runs, 5 assertions, 4 failures, 0 errors, 0 skips
01:24:57 ~/Code/rails/activerecord (4-2-stable) (2.2.5) -
01:24:26 ~/Code/rails/activerecord (5-0-stable) (2.2.5) + ARCONN=postgresql bundle exec ruby -Itest /Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb
Using postgresql
Run options: --seed 35866
# Running:
.FEEE
Finished in 0.051469s, 97.1459 runs/s, 38.8583 assertions/s.
1) Failure:
JoeTest#test_update_for_selected_column_and_updated_on_and_updated_at [/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:48]:
Expected: "blue"
Actual: nil
2) Error:
JoeTest#test_update_for_selected_column_and_updated_on:
NotImplementedError: NotImplementedError
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:84:in `type_cast'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:46:in `original_value'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:44:in `original_value'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:123:in `changed_from_assignment?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:55:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:25:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:9:in `block in changed_values'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `each'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `each_with_object'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `changed_values'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:83:in `changed_attributes'
/Users/joerafaniello/Code/rails/activemodel/lib/active_model/dirty.rb:146:in `changed'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:127:in `keys_for_partial_write'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:119:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:306:in `block in _update_record'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:506:in `block (2 levels) in compile'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:101:in `__run_callbacks__'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:750:in `_run_update_callbacks'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:306:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/timestamp.rb:81:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:534:in `create_or_update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:298:in `block in create_or_update'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:506:in `block (2 levels) in compile'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:101:in `__run_callbacks__'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:750:in `_run_save_callbacks'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:298:in `create_or_update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:125:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/validations.rb:44:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:22:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:319:in `block (2 levels) in save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:319:in `block in save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:318:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/suppressor.rb:41:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:266:in `block in update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:264:in `update'
/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:41:in `test_update_for_selected_column_and_updated_on'
3) Error:
JoeTest#test_update_for_unselected_column:
NotImplementedError: NotImplementedError
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:84:in `type_cast'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:46:in `original_value'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:44:in `original_value'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:123:in `changed_from_assignment?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:55:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:25:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:9:in `block in changed_values'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `each'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `each_with_object'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `changed_values'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:83:in `changed_attributes'
/Users/joerafaniello/Code/rails/activemodel/lib/active_model/dirty.rb:137:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/timestamp.rb:85:in `should_record_timestamps?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/timestamp.rb:72:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:534:in `create_or_update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:298:in `block in create_or_update'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:506:in `block (2 levels) in compile'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:101:in `__run_callbacks__'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:750:in `_run_save_callbacks'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:298:in `create_or_update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:125:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/validations.rb:44:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:22:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:319:in `block (2 levels) in save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:319:in `block in save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:318:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/suppressor.rb:41:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:266:in `block in update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:264:in `update'
/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:29:in `test_update_for_unselected_column'
4) Error:
JoeTest#test_update_for_selected_column:
NotImplementedError: NotImplementedError
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:84:in `type_cast'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:46:in `original_value'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:44:in `original_value'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:123:in `changed_from_assignment?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute.rb:55:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:25:in `changed?'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:9:in `block in changed_values'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `each'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `each_with_object'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_mutation_tracker.rb:8:in `changed_values'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:83:in `changed_attributes'
/Users/joerafaniello/Code/rails/activemodel/lib/active_model/dirty.rb:146:in `changed'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:127:in `keys_for_partial_write'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:119:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:306:in `block in _update_record'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:506:in `block (2 levels) in compile'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:101:in `__run_callbacks__'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:750:in `_run_update_callbacks'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:306:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/timestamp.rb:81:in `_update_record'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:534:in `create_or_update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:298:in `block in create_or_update'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:126:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:506:in `block (2 levels) in compile'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:455:in `call'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:101:in `__run_callbacks__'
/Users/joerafaniello/Code/rails/activesupport/lib/active_support/callbacks.rb:750:in `_run_save_callbacks'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/callbacks.rb:298:in `create_or_update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:125:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/validations.rb:44:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/attribute_methods/dirty.rb:22:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:319:in `block (2 levels) in save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:319:in `block in save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:318:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/suppressor.rb:41:in `save'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:266:in `block in update'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:211:in `transaction'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/Users/joerafaniello/Code/rails/activerecord/lib/active_record/persistence.rb:264:in `update'
/Users/joerafaniello/Code/rails/activerecord/test/cases/joe_test.rb:35:in `test_update_for_selected_column'
5 runs, 2 assertions, 1 failures, 3 errors, 0 skips
01:24:29 ~/Code/rails/activerecord (5-0-stable) (2.2.5) -
@jrafanie
Copy link
Author

jrafanie commented May 31, 2016

5-0-stable: 5 runs, 2 assertions, 1 failures, 3 errors, 0 skips

4-2-stable: 5 runs, 5 assertions, 4 failures, 0 errors, 0 skips

  • 4-2-stable and 5-0-stable seem to only update the column if you have a full object (where you don't use .select).
  • 5-0-stable raises the NotImplementedError if you leave off color, updated_on, or updated_at, whereas 4-2-stable silently doesn't update the color value.

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