Search code examples
ruby-on-railsrubydestroy

before destroy call back


I am a novice Ruby programmer working on a Rails API. I have a Location model and a User model, and a location has many users. They are related like this:

class Location << ActiveRecord::Base
  has_many: :users
end

class User << ActiveRecord::Base
  belongs_to :location
end

I want to put a constraint on the Location model so that a Location model object won't be destroyed if it has one or more associated Users.

Consider the case of Mumbai, which is a Location and it has one or more Users. As such, I cannot destroy that Location; I can destroy only if there are no users for a particular location.

How do to handle destroying records in a protected manner, such as this?


Solution

  • You can update your Location model to look like this:

    class Location << ActiveRecord::Base
      before_destroy :confirm_safe_to_destroy
    
      has_many: :users
    
    private
    
      def confirm_safe_to_destroy
        return false if users.any?
      end
    end
    

    This will use the before_destroy handler to check if it's safe to destroy the Location model object. The confirm_safe_to_destroy method returns false to halt the destroy process if there are any users associated with the location.