mirror of https://github.com/rails/rails
Define id_was to get the previous value of the primary key
Currently when we call id_was and we have a custom primary key name Active Record will return the current value of the primary key. This make impossible to correctly do an update operation if you change the id. Fixes #16413
This commit is contained in:
parent
ee255794b3
commit
e6e81f856e
|
@ -1,3 +1,14 @@
|
|||
* Define `id_was` to get the previous value of the primary key.
|
||||
|
||||
Currently when we call id_was and we have a custom primary key name
|
||||
Active Record will return the current value of the primary key. This
|
||||
make impossible to correctly do an update operation if you change the
|
||||
id.
|
||||
|
||||
Fixes #16413.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `DatabaseTasks.load_schema` to act on the current connection.
|
||||
Use `.load_schema_current` instead. In the future `load_schema` will
|
||||
require the `configuration` to act on as an argument.
|
||||
|
|
|
@ -39,6 +39,12 @@ module ActiveRecord
|
|||
read_attribute_before_type_cast(self.class.primary_key)
|
||||
end
|
||||
|
||||
# Returns the primary key previous value.
|
||||
def id_was
|
||||
sync_with_transaction_state
|
||||
attribute_was(self.class.primary_key)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def attribute_method?(attr_name)
|
||||
|
@ -54,7 +60,7 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast).to_set
|
||||
ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast id_was).to_set
|
||||
|
||||
def dangerous_attribute_method?(method_name)
|
||||
super && !ID_ATTRIBUTE_METHODS.include?(method_name)
|
||||
|
|
|
@ -5,6 +5,7 @@ require 'models/subscriber'
|
|||
require 'models/movie'
|
||||
require 'models/keyboard'
|
||||
require 'models/mixed_case_monkey'
|
||||
require 'models/dashboard'
|
||||
|
||||
class PrimaryKeysTest < ActiveRecord::TestCase
|
||||
fixtures :topics, :subscribers, :movies, :mixed_case_monkeys
|
||||
|
@ -164,6 +165,15 @@ class PrimaryKeysTest < ActiveRecord::TestCase
|
|||
MixedCaseMonkey.reset_primary_key
|
||||
assert_equal "monkeyID", MixedCaseMonkey.primary_key
|
||||
end
|
||||
|
||||
def test_primary_key_update_with_custom_key_name
|
||||
dashboard = Dashboard.create!(dashboard_id: '1')
|
||||
dashboard.id = '2'
|
||||
dashboard.save!
|
||||
|
||||
dashboard = Dashboard.first
|
||||
assert_equal '2', dashboard.id
|
||||
end
|
||||
end
|
||||
|
||||
class PrimaryKeyWithNoConnectionTest < ActiveRecord::TestCase
|
||||
|
|
Loading…
Reference in New Issue