diff options
author | Jon Leighton <j@jonathanleighton.com> | 2012-03-30 06:08:05 -0700 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2012-03-30 06:08:05 -0700 |
commit | 2eb111815d5f7a86a7dbd317075e396c94ab2c3d (patch) | |
tree | e6a5ced27b7fd486252b44b6d4f5dff304fcf58c /activerecord | |
parent | 34320cd6ba3423be7e0828c1486601aca53abc82 (diff) | |
parent | 2931f413a51f75e7365ac7dfe2e0bc2a27224c94 (diff) | |
download | rails-2eb111815d5f7a86a7dbd317075e396c94ab2c3d.tar.gz rails-2eb111815d5f7a86a7dbd317075e396c94ab2c3d.tar.bz2 rails-2eb111815d5f7a86a7dbd317075e396c94ab2c3d.zip |
Merge pull request #5334 from courtland/master
Fix deleting from a HABTM join table upon destroying an object of a model with optimistic locking enabled.
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/locking/optimistic.rb | 2 | ||||
-rw-r--r-- | activerecord/test/cases/locking_test.rb | 12 | ||||
-rw-r--r-- | activerecord/test/fixtures/peoples_treasures.yml | 3 | ||||
-rw-r--r-- | activerecord/test/models/person.rb | 6 | ||||
-rw-r--r-- | activerecord/test/schema/schema.rb | 5 |
5 files changed, 27 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/locking/optimistic.rb b/activerecord/lib/active_record/locking/optimistic.rb index 8266427b71..64433f580a 100644 --- a/activerecord/lib/active_record/locking/optimistic.rb +++ b/activerecord/lib/active_record/locking/optimistic.rb @@ -104,6 +104,8 @@ module ActiveRecord def destroy #:nodoc: return super unless locking_enabled? + destroy_associations + if persisted? table = self.class.arel_table lock_col = self.class.locking_column diff --git a/activerecord/test/cases/locking_test.rb b/activerecord/test/cases/locking_test.rb index 807274ca67..a8fb3548f6 100644 --- a/activerecord/test/cases/locking_test.rb +++ b/activerecord/test/cases/locking_test.rb @@ -22,7 +22,7 @@ class ReadonlyFirstNamePerson < Person end class OptimisticLockingTest < ActiveRecord::TestCase - fixtures :people, :legacy_things, :references, :string_key_objects + fixtures :people, :legacy_things, :references, :string_key_objects, :peoples_treasures def test_non_integer_lock_existing s1 = StringKeyObject.find("record1") @@ -239,6 +239,16 @@ class OptimisticLockingTest < ActiveRecord::TestCase end assert car.destroyed? end + + def test_removing_has_and_belongs_to_many_associations_upon_destroy + p = RichPerson.create! + p.treasures.create! + assert !p.treasures.empty? + p.destroy + assert p.treasures.empty? + assert RichPerson.connection.select_all("SELECT * FROM peoples_treasures WHERE rich_person_id = 1").empty? + end + end class OptimisticLockingWithSchemaChangeTest < ActiveRecord::TestCase diff --git a/activerecord/test/fixtures/peoples_treasures.yml b/activerecord/test/fixtures/peoples_treasures.yml new file mode 100644 index 0000000000..a72b190d0c --- /dev/null +++ b/activerecord/test/fixtures/peoples_treasures.yml @@ -0,0 +1,3 @@ +michael_diamond: + rich_person_id: <%= ActiveRecord::Fixtures.identify(:michael) %> + treasure_id: <%= ActiveRecord::Fixtures.identify(:diamond) %> diff --git a/activerecord/test/models/person.rb b/activerecord/test/models/person.rb index b7d5dabc4f..d5c0b351aa 100644 --- a/activerecord/test/models/person.rb +++ b/activerecord/test/models/person.rb @@ -85,3 +85,9 @@ class TightPerson < ActiveRecord::Base end class TightDescendant < TightPerson; end + +class RichPerson < ActiveRecord::Base + self.table_name = 'people' + + has_and_belongs_to_many :treasures, :join_table => 'peoples_treasures' +end diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index d5e4f165cb..04c20c9128 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -469,6 +469,11 @@ ActiveRecord::Schema.define do t.references :best_friend_of t.timestamps end + + create_table :peoples_treasures, :id => false, :force => true do |t| + t.column :rich_person_id, :integer + t.column :treasure_id, :integer + end create_table :pets, :primary_key => :pet_id ,:force => true do |t| t.string :name |