Rails: validating a field is present only if another is present

14,735

Solution 1

You can use a Proc on the :activated_at validator.

validates :activated_at, :presence, if: Proc.new { |a| a.is_activated? }

Recommended Reading:


Finally, you should consider renaming :is_activated to simply :activated. This is considered better practice in Rails. The is_ prefix is used in other languages for boolean attributes because their method names don't support a ? character. Ruby does, and Rails generates ___? methods on boolean attributes. Because of this it's better to just call the attribute :activated and check it with activated?.

Solution 2

Non-Boolean Attributes.

If you're not using a Boolean attribute, like is_activated, and want to ensure that one attribute is present when another, non-Boolean attribute is present, you can simplify it:

validates :activated_at, presence: true, if: :activated_by?

activated_by? will return false when null and true otherwise.

Solution 3

You could do something like this:

validates :activated_at, presence: true, if: :is_activated?

def is_activated?
  self.is_activated
end

This will only validate :activated_at if the method is_activated? returns true.

Share:
14,735

Related videos on Youtube

bignay2000
Author by

bignay2000

Updated on September 15, 2022

Comments

  • bignay2000
    bignay2000 over 1 year

    I have a model where there are two fields that can technically be null. The field names are :is_activated and :activated_at. :activated_at is only required if :is_activated is set to true. It does not need to be present if :is_activated is false. What's the appropriate way in Rails to set this validation directly into ActiveRecord?