fix deleting join models with no pk

This commit is contained in:
Aaron Patterson 2013-09-11 11:23:11 -07:00
parent 233c6d4c29
commit 7e0cac156e
2 changed files with 62 additions and 6 deletions

@ -140,7 +140,21 @@ def delete_records(records, method)
case method
when :destroy
count = scope.destroy_all.length
if scope.klass.primary_key
count = scope.destroy_all.length
else
scope.to_a.each do |record|
record.run_callbacks :destroy
end
arel = scope.arel
stmt = Arel::DeleteManager.new arel.engine
stmt.from scope.klass.arel_table
stmt.wheres = arel.constraints
count = scope.klass.connection.delete(stmt, 'SQL', scope.bind_values)
end
when :nullify
count = scope.update_all(source_reflection.foreign_key => nil)
else

@ -65,6 +65,52 @@ def test_singleton_has_many_through
end
def test_no_pk_join_table_append
lesson, _, student = make_no_pk_hm_t
sicp = lesson.new(:name => "SICP")
ben = student.new(:name => "Ben Bitdiddle")
sicp.students << ben
assert sicp.save!
end
def test_no_pk_join_table_delete
lesson, lesson_student, student = make_no_pk_hm_t
sicp = lesson.new(:name => "SICP")
ben = student.new(:name => "Ben Bitdiddle")
louis = student.new(:name => "Louis Reasoner")
sicp.students << ben
sicp.students << louis
assert sicp.save!
sicp.students.reload
assert_operator lesson_student.count, :>=, 2
assert_no_difference('student.count') do
assert_difference('lesson_student.count', -2) do
sicp.students.destroy(*student.all.to_a)
end
end
end
def test_no_pk_join_model_callbacks
lesson, lesson_student, student = make_no_pk_hm_t
after_destroy_called = false
lesson_student.after_destroy do
after_destroy_called = true
end
sicp = lesson.new(:name => "SICP")
ben = student.new(:name => "Ben Bitdiddle")
sicp.students << ben
assert sicp.save!
sicp.students.reload
sicp.students.destroy(*student.all.to_a)
assert after_destroy_called, "after destroy should be called"
end
def make_no_pk_hm_t
lesson = make_model 'Lesson'
student = make_model 'Student'
@ -75,11 +121,7 @@ def test_no_pk_join_table_append
lesson_student.belongs_to :student, :class => student
lesson.has_many :lesson_students, :class => lesson_student
lesson.has_many :students, :through => :lesson_students, :class => student
sicp = lesson.new(:name => "SICP")
ben = student.new(:name => "Ben Bitdiddle")
sicp.students << ben
assert sicp.save!
[lesson, lesson_student, student]
end
def test_pk_is_not_required_for_join