aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/transactions_test.rb
diff options
context:
space:
mode:
authorJonathan del Strother <jon.delStrother@audioboo.fm>2015-01-05 19:42:39 +0000
committerJonathan del Strother <jon.delStrother@audioboo.fm>2015-01-05 20:47:41 +0000
commitf634c1fcf4796f633685f6801e260e0e792e547e (patch)
tree67a065419c9db61380dcf87ba782cadd09f5bb78 /activerecord/test/cases/transactions_test.rb
parentc7a1fa364012c70e76d19b36881c9bde016091b8 (diff)
downloadrails-f634c1fcf4796f633685f6801e260e0e792e547e.tar.gz
rails-f634c1fcf4796f633685f6801e260e0e792e547e.tar.bz2
rails-f634c1fcf4796f633685f6801e260e0e792e547e.zip
Fix rollback of primarykey-less tables
If you have a table without a primary key, and an `after_commit` callback on that table (ie `has_transactional_callbacks?` returns true), then trying to rollback a transaction involving that record would result in “ActiveModel::MissingAttributeError: can't write unknown attribute ``”
Diffstat (limited to 'activerecord/test/cases/transactions_test.rb')
-rw-r--r--activerecord/test/cases/transactions_test.rb22
1 files changed, 22 insertions, 0 deletions
diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb
index e0aecb5996..a89c24f57e 100644
--- a/activerecord/test/cases/transactions_test.rb
+++ b/activerecord/test/cases/transactions_test.rb
@@ -653,6 +653,28 @@ class TransactionTest < ActiveRecord::TestCase
assert transaction.state.committed?
end
+ def test_transaction_rollback_with_primarykeyless_tables
+ connection = ActiveRecord::Base.connection
+ connection.create_table(:transaction_without_primary_keys, force: true, id: false) do |t|
+ t.integer :thing_id
+ end
+
+ klass = Class.new(ActiveRecord::Base) do
+ self.table_name = 'transaction_without_primary_keys'
+ after_commit { } # necessary to trigger the has_transactional_callbacks branch
+ end
+
+ assert_no_difference(-> { klass.count }) do
+ ActiveRecord::Base.transaction do
+ klass.create!
+ raise ActiveRecord::Rollback
+ end
+ end
+
+ ensure
+ connection.execute("DROP TABLE IF EXISTS transaction_without_primary_keys")
+ end
+
private
%w(validation save destroy).each do |filter|