Skip to content

A gem that automatically decides between :destroy and :delete / :delete_all for your Rails associations

License

Notifications You must be signed in to change notification settings

joshuay03/dependent-auto-rails

Repository files navigation

Version Build

dependent-auto-rails

This gem provides a new dependent option for ActiveRecord associations, :auto. Using this option will automatically select between :destroy and :delete / :delete_all during runtime based on whether or not the associated model has any callbacks defined which would usually be executed as part of the destroy lifecycle.

This is useful since dependent: :destroy always initialises the associated records in order to execute their callbacks regardless of whether or not there are any defined, but is often the go-to option since it is the safest. This can be expensive if there are many records to destroy.

It is also useful since a model's associations are rarely updated, but it's business logic can change frequently. This means that if callbacks are added or removed on the associated model, the dependent option on the parent model's association may need to be updated to reflect this. Using dependent: :auto will automatically select the appropriate dependent option based on the current state of the model.

NOTE: The :auto option ONLY decides between :destroy and :delete / :delete_all. It does not use any of the other dependent options:

  • :nullify
  • :destroy_async
  • :restrict_with_error
  • :restrict_with_exception

NOTE: If for some reason the :auto option is unable to decide between :destroy and :delete / :delete_all, it will default to :destroy.

INFO: If you're looking for a solution with a little less magic, check out the incorrect_dependent_option detector provided by https://github.com/gregnavis/active_record_doctor.

Installation

Install the gem and add it to the application's Gemfile by executing:

$ bundle add dependent-auto-rails

If bundler is not being used to manage dependencies, install the gem by executing:

$ gem installdependent-auto-rails

Usage

To use this gem, all you need to do is add dependent: :auto to your model associations where you would usually use one of:

  • dependent: :destroy (belongs_to, has_one, has_many)
  • dependent: :delete (belongs_to, has_one)
  • dependent: :delete_all (has_many).
class Post < ApplicationRecord
  belongs_to :author, dependent: :auto

  has_one :pinned_comment, dependent: :auto

  has_many :comments, dependent: :auto
end

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/joshuay03/dependent-auto-rails. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Dependent::Auto::Rails project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

About

A gem that automatically decides between :destroy and :delete / :delete_all for your Rails associations

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published