Dependent: :Destroy
In Rails, Active Record associations can easily connect our models, allowing for common operations to be streamlined. (For more on Active Record associations, check out my blog post on them here!) One option that can be added to these associations is the dependent destroy option. When an object is deleted from your database, dependent: :destroy will call destroy on all associated objects for you.
Why use dependent destroy?
During Phase 3 of Bootcamp, my partner and I created a word game that asked the user to choose the word that matched the picture on the screen. Our User model has_many :games and each Game belongs_to :user. Our User was able to delete themselves from the database but every time we deleted a User, the rest of our application would break. We finally narrowed down our bug to having orphaned Game instances left in our database. Our orphaned Game instances no longer had an associated User, since that User was deleted. After solving this problem in a much more complicated way, our instructor introduced us to a much better and built-in option: dependent: :destroy.
Dependent: :Destroy to the rescue!
Dependent: :Destroy is added to your has_many association declaration like so:
With this option added, whenever a User is deleted all of the Game instances that are associated with that User are also deleted. Ensuring you leave no orphaned data behind is as simple as that.
Where do I add Dependent: :Destroy?
The dependent: :destroy option should never be added to a belongs_to association that is connected to a has_many association of another class. Doing so can lead to orphaned data. The dependent: :destroy option should be added to the association that you want to also be deleted when you delete the "parent" instance. For example, in another project I had instances of Trips and each of those Trips has_many :items. When I deleted a Trip from the database, I wanted all Items associated with that Trip to be deleted as well. To ensure this, I added the dependent destroy option to my Trip class, on my has_many :items association:
In summary, dependent: :destroy is a great and easily implemented option to ensure you leave no orphaned data behind.
Resources:
Rails Guide: Active Record Associations
Top comments (0)