LearningRoR
LearningRoR

Reputation: 27232

Validation to not allow both fields to be used issue

I have a Price model with 4 different fields:

t.decimal  "amount"
t.decimal  "amount_per_unit"
t.decimal  "unit_quantity"
t.string   "unit"

I'm trying to make a custom validation that allows either the amount or amount_per_unit fields (this includes unit quantity and unit) to be filled but not both of them. So to make a word diagram of what I mean.

amount = YES
amount_per_unit + unit + unit_quantity = YES

amount_per_unit (alone or amount.present) = NO
unit_quantity (alone or amount.present) = NO
unit (alone or amount.present) = NO
amount and amount_per_unit + unit + unit_quantity = NO

if you still are confused, just know that its either the amount itself thats filled in or the amount per unit fields that are (1 or 3).

So far I tried this validation in my Price model:

validates :amount, :numericality => true                                
validates :amount_per_unit, :numericality => true       
validates :unit_quantity, :numericality => true
validates :unit, :inclusion => UNITS

validate :must_be_base_cost_or_cost_per_unit

private

  def must_be_base_cost_or_cost_per_unit
    if self.amount.blank? and self.amount_per_unit.blank? and self.unit.blank? and self.unit_quantity
        #   one at least must be filled in, add a custom error message
        errors.add(:amount, "The product must have a base price or a cost per unit.")
        return false
    elsif !self.amount.blank? and !self.amount_per_unit.blank? and !self.unit.blank? and !self.unit_quantity
        #   both can't be filled in, add custom error message
        errors.add(:amount, "Cannot have both a base price and a cost per unit.")
        return false
    else
        return true
    end
  end

This validation doesn't work though as all fields are blank it results to a numericality error and if I fill all of them, it creates the price with all fields filled. What needs to be fixed?

Upvotes: 0

Views: 118

Answers (1)

Tabrez
Tabrez

Reputation: 3466

I think your values are coming in as nil, not blank.

Try changing the second condition to:

elsif !self.amount.to_s.blank? and !self.amount_per_unit.to_s.blank? and !self.unit.to_s.blank? and !self.unit_quantity.to_s.blank?

Also, it seems you have a typo on the last condition on both statements (e.g. !self.unit_quantity instead of !self.unit_quantity.to_s.blank?

I hope that helps.

Upvotes: 1

Related Questions