Rails: Validating existence of an association

I've put this in my model:

  validate :ensure_category_exists

  def ensure_category_exists
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id)
  end

Which prints "Category is invalid" if the category does not exist for the parent blog.


It's definitely worth mentioning my experiences. This is for Rails 4 (potentially other versions as well).

Given an entity has_many or has_one of a model.

Validation that will ensure the entered association (association ID) exists, even if there is an ID given in the submission.

validates_presence_of :model

IS NOT THE SAME as a validation that will ensure there is something entered (not blank) in the input.

validates_presence_of :model_id

You may be able to get by with just the former, but I have both to have more specific error messages.


In Rails 3.2, validates_existence_of is replaced by validates_presence_of.


http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base
  belongs_to :category
  validates_presence_of :category 
end

-OR-

class Post < ActiveRecord::Base
  belongs_to :category
  validates :category, presence: true
end

Rails versions prior to 3.2:

class Post < ActiveRecord::Base
  belongs_to :category
  validates_existence_of :category 
end