Defect #27165

Delete_all_members

Added by Enrique Vera 6 months ago. Updated 6 months ago.

Status:NewStart date:
Priority:NormalDue date:
Assignee:-% Done:

0%

Category:Projects
Target version:-
Resolution: Affected version:

Description

The method delete_all_members in the model Project is the next:

def delete_all_members
    me, mr = Member.table_name, MemberRole.table_name
    self.class.connection.delete("DELETE FROM #{mr} WHERE #{mr}.member_id IN (SELECT #{me}.id FROM #{me} WHERE #{me}.project_id = #{id})")
    Member.delete_all(['project_id = ?', id])
end

I was doing some test capturing the destroy event on a member patch and I realized that the event on this patch was only ran in some members.

The question is, why we have to do a class.connection to delete the member_roles and then run a member.delete_all if we have connected the models correctly.

I proved with this:

def delete_all_members
    me, mr = Member.table_name, MemberRole.table_name
    Member.destroy_all(['project_id = ?', id])
end

and the results were ok. Is there something that I don't know of it's a defect?

Thanks!

History

#1 Updated by Holger Just 6 months ago

When using destroy_all (or destroy) on a model, what happens is that Rails first fetches the record from the database, destroys it and runs any defined callbacks. If you have a lot of members, this can be very expensive.

With the way this is done in Redmine right now, it deletes the necessary records from the database directly with two DELETE SQL statements without first fetching the records them and creating ActiveRecord model instances for each of them.

#2 Updated by Toshi MARUYAMA 6 months ago

  • Description updated (diff)

Also available in: Atom PDF