Cleaner way to build a "one or the other" validation?

I have an object called dealer. Dealer has two fields dealer_number and sub_dealer_number. It must have 1 OR the other... but not both. To validate this I have:

class Dealer < ActiveRecord::Base   validate :dealer_id?

private   def dealer_id?     if number.blank? && sub_number.blank?       errors.add_to_base("You must specify either a Dealer Number OR a Sub Dealer Number.")     elsif (number.length > 0) && (sub_number.length > 0)         errors.add_to_base("You must specify either a Dealer Number OR a Sub Dealer Number.")     end   end end

This looks really messy to me. Is there a better way? Thank you for your thoughts.

I have an object called dealer. Dealer has two fields dealer_number and sub_dealer_number. It must have 1 OR the other... but not both. To validate this I have:

Use the Xor operator ( ^ ) ?

Fred

How about:

def validate_dealer_id   if number.blank? then     errors.add_to_base("You must specify either a Dealer Number OR a Sub Dealer Number.") if subnumber.blank?   else     erros.add_to_base("A dealer can't have both a dealer number AND a sub dealer number") unless subnumber.blank?   end end

?

Extra bonus kibbitzing: - Would it make things any easier to store both those    numbers in a single field, and keep track of whether    a given dealer is a dealer or a sub in a separate 'dealer_type'    field? - FWIW--the ruby convention is that methods whose names    end in a ? return a boolean.

Cheers,

-Roy

Frederick Cheung wrote:

Use the Xor operator ( ^ ) ?

Fred

Sexy. Thanks.

I changed above to:

class Dealer < ActiveRecord::Base   validate :dealer_id?

private   def dealer_id?     if !(number.blank? ^ sub_number.blank?)       errors.add_to_base("You must specify either a Dealer Number OR a Sub Dealer Number.")     end   end end

Makes me feel less dirty.

Roy Pardee wrote:

How about:

def validate_dealer_id   if number.blank? then     errors.add_to_base("You must specify either a Dealer Number OR a Sub Dealer Number.") if subnumber.blank?   else     erros.add_to_base("A dealer can't have both a dealer number AND a sub dealer number") unless subnumber.blank?   end end

?

Extra bonus kibbitzing: - Would it make things any easier to store both those    numbers in a single field, and keep track of whether    a given dealer is a dealer or a sub in a separate 'dealer_type'    field? - FWIW--the ruby convention is that methods whose names    end in a ? return a boolean.

Cheers,

-Roy

I don't think that your above example is any cleaner then my original solution. However, your bonus kibbitzing (lol) I think is a really good thought. I am going to implement this logic on a later iteration. Thanks for this.

Michael Kahle wrote:

I don't think that your above example is any cleaner then my original solution. However, your bonus kibbitzing (lol) I think is a really good thought. I am going to implement this logic on a later iteration. Thanks for this.

Hi Michael,

For future reference, I needed to do something similar a few months ago and ended up creating a custom validation. I wrote about it if you want to look into it:

http://per-snicket-y.blogspot.com/2008/04/custom-validations-in-rails-202.html

Peace.