validates_numericality_of :not_equal_to

I have a situation in which I want to validate a number is not zero.
Both positive and negative values are acceptable, just not zero.
validates_numericality_of has an :equal_to attribute, but I don't see a
:not_equal_to. I have not yet been able to find anyone who has
discussed this. I did find information about custom validators, so I am
now using a custom validator to check the field and add an appropriate
error message.

Is there an easier way, ideally without using validates_format_of? It
seems like it would be a relatively common problem. How do others solve
it?

Peace,
Phillip

Philip,

One thought: roll your own validation helper. I.e. take the source
code to validates_numericality_of and create your own, maybe something
like: validates_nonzeroness_of

It would be pretty simply as it's probably what you have in your
custom validator. But then you could define it within the context of a
helper or a lib and then use it the same as the other validates_
calls.

It's possible you could do it with validates_format_of but that might
not be the best. You need to do a two-check validation. One, that the
field is an integer and two, that it is not equal to zero.

-Danimal

I have a situation in which I want to validate a number is not zero.
Both positive and negative values are acceptable, just not zero.
validates_numericality_of has an :equal_to attribute, but I don't see a
:not_equal_to. I have not yet been able to find anyone who has
discussed this. I did find information about custom validators, so I am
now using a custom validator to check the field and add an appropriate
error message.

Is there an easier way, ideally without using validates_format_of? It
seems like it would be a relatively common problem. How do others solve
it?

Don't expect any single validation to necessarily take care of all your
validation needs for a particular field. I'd use validates_exclusion_of for
this, in addition to validates_numericality_of.

Peace,
Phillip

--Greg

Thanks for the thought, Danimal. I have been thinking about doing
something like that, but wanted to see if someone else has already done
it, and if so, how they did. If I can't find anything suitable, I'll
probably create something like a validates_not_equal_to so it can be a
bit more versatile. I found something yesterday (though now I can't
remember where it is) that someone did that and added it in.

Peace,
Phillip

Philip,

If you look at all the different validations and all their different
options, there is some overlap. I think it's good overlap... i.e. when
a particular validation makes sense to have X,Y and Z as options, it
shouldn't matter if another validation already has Y. Others may
disagree, but I like the idea that, for example,
validates_numericality_of has the right options for all the
numericality validations I'd need.

Of course, it could get too convoluted and the argument for using
multiple validations for a single attribute has value as well.

So I can see both sides of it, although I lean more toward the
"overlap is ok" side. (Oh no! The DRY police are banging on my door!)

And based on that, I'd say: add a :not_equal_to to
validates_numericality_of and then maybe also add a generic
validates_no_equal_to.

But only if you are going to release it. If you just need it to solve
your particular issue, then adding a :not_equal_to is the best and
quickest solution, IMO. You'll already have the numeric validation and
you can get the not equal to 0 as a parameter on the validation
instead of a separate validation call.

If you'd rather not write any custom code, then I suspect that:
validates_numericality_of :number
validates_exclusion_of :number, :in => [0]

should do what you need, right?

Just some ramblings.

-Danimal

At the end of the day, I did go with creating custom validations and
adding them into AR. I wrote just a little bit about it at

http://imverbose.blogspot.com/2008/04/custom-validations-in-rails-202.html

I'm not a blogger, so don't expect too much.

Peace,
Phillip