fix deleting join models with no pk
This commit is contained in:
parent
233c6d4c29
commit
7e0cac156e
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user