randombits
randombits

Reputation: 48450

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

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?

Upvotes: 18

Views: 16434

Answers (3)

deefour
deefour

Reputation: 35360

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?.

Upvotes: 44

Joshua Pinter
Joshua Pinter

Reputation: 47481

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.

Upvotes: 7

Zajn
Zajn

Reputation: 4088

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.

Upvotes: 1

Related Questions