mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #18791 from Sinjo/consistent-foreign-key-name-generation
Consistent foreign key name generation
This commit is contained in:
commit
186418724c
3 changed files with 16 additions and 3 deletions
|
@ -1,3 +1,12 @@
|
|||
* Foreign keys added by migrations were given random, generated names. This
|
||||
meant a different `structure.sql` would be generated every time a developer
|
||||
ran migrations on their machine.
|
||||
|
||||
The generated part of foreign key names is now a hash of the table name and
|
||||
column name, which is consistent every time you run the migration.
|
||||
|
||||
*Chris Sinjakli*
|
||||
|
||||
* Validation errors would be raised for parent records when an association
|
||||
was saved when the parent had `validate: false`. It should not be the
|
||||
responsibility of the model to validate an associated object unless the
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
require 'active_record/migration/join_table'
|
||||
require 'active_support/core_ext/string/access'
|
||||
require 'digest'
|
||||
|
||||
module ActiveRecord
|
||||
module ConnectionAdapters # :nodoc:
|
||||
|
@ -990,8 +992,10 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def foreign_key_name(table_name, options) # :nodoc:
|
||||
identifier = "#{table_name}_#{options.fetch(:column)}_fk"
|
||||
hashed_identifier = Digest::SHA256.hexdigest(identifier).first(10)
|
||||
options.fetch(:name) do
|
||||
"fk_rails_#{SecureRandom.hex(5)}"
|
||||
"fk_rails_#{hashed_identifier}"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ module ActiveRecord
|
|||
assert_equal "rockets", fk.to_table
|
||||
assert_equal "rocket_id", fk.column
|
||||
assert_equal "id", fk.primary_key
|
||||
assert_match(/^fk_rails_.{10}$/, fk.name)
|
||||
assert_equal("fk_rails_78146ddd2e", fk.name)
|
||||
end
|
||||
|
||||
def test_add_foreign_key_with_column
|
||||
|
@ -71,7 +71,7 @@ module ActiveRecord
|
|||
assert_equal "rockets", fk.to_table
|
||||
assert_equal "rocket_id", fk.column
|
||||
assert_equal "id", fk.primary_key
|
||||
assert_match(/^fk_rails_.{10}$/, fk.name)
|
||||
assert_equal("fk_rails_78146ddd2e", fk.name)
|
||||
end
|
||||
|
||||
def test_add_foreign_key_with_non_standard_primary_key
|
||||
|
|
Loading…
Reference in a new issue