Fixing ordering of HABTM association deletion [#6191 state:resolved]

Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
This commit is contained in:
Edward Faulkner
2011-02-04 15:34:44 -05:00
committed by Santiago Pastorino
parent df07760486
commit 909588d964
6 changed files with 46 additions and 2 deletions

View File

@@ -1450,8 +1450,8 @@ module ActiveRecord
include Module.new {
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def destroy # def destroy
#{reflection.name}.clear # posts.clear
super # super
#{reflection.name}.clear # posts.clear
end # end
RUBY
}

View File

@@ -365,7 +365,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
def test_removing_associations_on_destroy
david = DeveloperWithBeforeDestroyRaise.find(1)
assert !david.projects.empty?
assert_raise(RuntimeError) { david.destroy }
david.destroy
assert david.projects.empty?
assert DeveloperWithBeforeDestroyRaise.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = 1").empty?
end

View File

@@ -0,0 +1,17 @@
require "cases/helper"
require "models/lesson"
require "models/student"
class HabtmDestroyOrderTest < ActiveRecord::TestCase
test "may not delete a lesson with students" do
sicp = Lesson.new(:name => "SICP")
ben = Student.new(:name => "Ben Bitdiddle")
sicp.students << ben
sicp.save!
assert_raises LessonError do
assert_no_difference('Lesson.count') do
sicp.destroy
end
end
end
end

View File

@@ -0,0 +1,11 @@
class LessonError < Exception
end
class Lesson < ActiveRecord::Base
has_and_belongs_to_many :students
before_destroy :ensure_no_students
def ensure_no_students
raise LessonError unless students.empty?
end
end

View File

@@ -0,0 +1,3 @@
class Student < ActiveRecord::Base
has_and_belongs_to_many :lessons
end

View File

@@ -279,6 +279,15 @@ ActiveRecord::Schema.define do
t.integer :version, :null => false, :default => 0
end
create_table :lessons, :force => true do |t|
t.string :name
end
create_table :lessons_students, :id => false, :force => true do |t|
t.references :lesson
t.references :student
end
create_table :line_items, :force => true do |t|
t.integer :invoice_id
t.integer :amount
@@ -509,6 +518,10 @@ ActiveRecord::Schema.define do
t.string :sponsorable_type
end
create_table :students, :force => true do |t|
t.string :name
end
create_table :subscribers, :force => true, :id => false do |t|
t.string :nick, :null => false
t.string :name