diff options
author | Yves Senn <yves.senn@gmail.com> | 2012-10-28 18:05:30 +0100 |
---|---|---|
committer | Yves Senn <yves.senn@gmail.com> | 2012-10-28 20:40:37 +0100 |
commit | e4790a2c5b99704f430c837d8f22fec418f2c8af (patch) | |
tree | d774ad70503daabeaba3233a0da1f7fcf94a7e17 | |
parent | b104157314e95115b74e7ddd968f9c7734309a6e (diff) | |
download | rails-e4790a2c5b99704f430c837d8f22fec418f2c8af.tar.gz rails-e4790a2c5b99704f430c837d8f22fec418f2c8af.tar.bz2 rails-e4790a2c5b99704f430c837d8f22fec418f2c8af.zip |
raise `ArgumentError` when redefining the primary key column. Closes #6378
-rw-r--r-- | activerecord/CHANGELOG.md | 5 | ||||
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb | 9 | ||||
-rw-r--r-- | activerecord/test/cases/migration/change_schema_test.rb | 20 |
3 files changed, 34 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index f630be6f70..4916777ce7 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,5 +1,10 @@ ## Rails 4.0.0 (unreleased) ## +* The `create_table` method raises an `ArgumentError` when the primary key column is redefined. + Fix #6378 + + *Yves Senn* + * `ActiveRecord::AttributeMethods#[]` raises `ActiveModel::MissingAttributeError` error if the given attribute is missing. Fixes #5433. diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb index dca355aa93..0f6b177b62 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb @@ -234,6 +234,10 @@ module ActiveRecord name = name.to_s type = type.to_sym + if primary_key_column_name == name + raise ArgumentError, "you can't redefine the primary key column '#{name}'. To define a custom primary key, pass { id: false } to create_table." + end + column = self[name] || new_column_definition(@base, name, type) limit = options.fetch(:limit) do @@ -302,6 +306,11 @@ module ActiveRecord definition end + def primary_key_column_name + primary_key_column = columns.detect { |c| c.type == :primary_key } + primary_key_column && primary_key_column.name + end + def native @base.native_database_types end diff --git a/activerecord/test/cases/migration/change_schema_test.rb b/activerecord/test/cases/migration/change_schema_test.rb index 17c1634444..86451289e7 100644 --- a/activerecord/test/cases/migration/change_schema_test.rb +++ b/activerecord/test/cases/migration/change_schema_test.rb @@ -132,6 +132,26 @@ module ActiveRecord assert_equal %w(foo testingid), connection.columns(:testings).map(&:name).sort end + def test_create_table_raises_when_redefining_primary_key_column + error = assert_raise(ArgumentError) do + connection.create_table :testings do |t| + t.column :id, :string + end + end + + assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message + end + + def test_create_table_raises_when_redefining_custom_primary_key_column + error = assert_raise(ArgumentError) do + connection.create_table :testings, primary_key: :testing_id do |t| + t.column :testing_id, :string + end + end + + assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message + end + def test_create_table_with_timestamps_should_create_datetime_columns connection.create_table table_name do |t| t.timestamps |