mirror of
https://github.com/github/rails.git
synced 2026-01-09 14:48:01 -05:00
Fixing ordering of HABTM association deletion [#6191 state:resolved]
Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
This commit is contained in:
committed by
Santiago Pastorino
parent
df07760486
commit
909588d964
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
17
activerecord/test/cases/habtm_destroy_order_test.rb
Normal file
17
activerecord/test/cases/habtm_destroy_order_test.rb
Normal 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
|
||||
11
activerecord/test/models/lesson.rb
Normal file
11
activerecord/test/models/lesson.rb
Normal 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
|
||||
3
activerecord/test/models/student.rb
Normal file
3
activerecord/test/models/student.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
class Student < ActiveRecord::Base
|
||||
has_and_belongs_to_many :lessons
|
||||
end
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user