提交 b8e1f202 编写于 作者: C Chris Sinjakli

Generate consistent names for foreign keys

上级 35d77130
* 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
......
require 'active_record/migration/join_table'
require 'active_support/core_ext/string/access'
require 'digest'
module ActiveRecord
module ConnectionAdapters # :nodoc:
......@@ -990,8 +992,10 @@ def create_alter_table(name)
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 @@ def test_add_foreign_key_inferes_column
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 @@ def test_add_foreign_key_with_column
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册