Rails 6 delete_by, destroy_by ActiveRecord::Relation

Abhay Nikam

Abhay Nikam

March 13, 2019

This blog is part of our  Rails 6 series.

As described by DHH in the issue, Rails has find_or_create_by, find_by and similar methods to create and find the records matching the specified conditions. Rails was missing similar feature for deleting/destroying the record(s).

Before Rails 6, deleting/destroying the record(s) which are matching the given condition was done as shown below.

1
2# Example to destroy all authors matching the given condition
3
4Author.find_by(email: "[email protected]").destroy
5Author.where(email: "[email protected]", rating: 4).destroy_all
6
7# Example to delete all authors matching the given condition
8
9Author.find_by(email: "[email protected]").delete
10Author.where(email: "[email protected]", rating: 4).delete_all

The above examples were missing the symmetry like find_or_create_by and find_by methods.

In Rails 6, the new delete_by and destroy_by methods have been added as ActiveRecord::Relation methods. ActiveRecord::Relation#delete_by is short-hand for relation.where(conditions).delete_all. Similarly, ActiveRecord::Relation#destroy_by is short-hand for relation.where(conditions).destroy_all.

Here is how it can be used.

1
2# Example to destroy all authors matching the given condition using destroy_by
3
4Author.destroy_by(email: "[email protected]")
5Author.destroy_by(email: "[email protected]", rating: 4)
6
7# Example to destroy all authors matching the given condition using delete_by
8
9Author.delete_by(email: "[email protected]")
10Author.delete_by(email: "[email protected]", rating: 4)

Check out the pull request for more details on this.

If this blog was helpful, check out our full blog archive.

Stay up to date with our blogs.

Subscribe to receive email notifications for new blog posts.