validations in Rails 4.2

Hello. I know the title may be broad, but I am not sure how else to put it.

I am writing a model, in which the attribute “number_of_extensions” needs 2 things:

  1. It is required for this model
  2. It must be a whole, positive number

I know I can do this simply by

validates :number_of_extensions, presence: true, numericality: { only_integer: true }

``

However, if I validate for JUST numericality, is it assumed that the attribute SHOULD be present?

In my database, I cannot restrict NULL values for this column. The model I am working on is a child of another, where the main model does not require # of extensions, but this child model does.

Also, while I am talking about validations, I have another question:

I know that the following type of validations is not in the docs anymore, but it is still supported. Would the following line be possible?

validates_numericality_of :number_of_extensions, :number_of_sidecars, :number_of_phones, only_integer: true

``

Thank you for the time and help!

Hello. I know the title may be broad, but I am not sure how else to put it.

I am writing a model, in which the attribute "number_of_extensions" needs 2 things: 1. It is required for this model 2. It must be a whole, positive number

I know I can do this simply by

validates :number_of_extensions, presence: true, numericality: { only_integer: true }

However, if I validate for JUST numericality, is it assumed that the attribute SHOULD be present?

That is so; there is an option to allow nil or blank, but it is false by default. As it needs to be positive, you should also specify `greater_than: 0` in the options hash.

Also, while I am talking about validations, I have another question:

I know that the following type of validations is not in the docs anymore, but it is still supported. Would the following line be possible?

validates_numericality_of :number_of_extensions, :number_of_sidecars, : number_of_phones, only_integer: true

I'm pretty sure that is still in:

http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_numericality_of

Thank you, I did not think of including greater_than: 0 in the validations!

The docs I was referring to were Rails Guides, which I take for granted as THE docs. Thank you for the appropriate link!

Finally, just to clarify (because I want to make sure I understand):

  1. The database allows NULL for :number_of_extensions
  2. The sub-model requires :number_of_extensions to NOT be nil or blank
  3. The sub model requires :number_of_extensions to be a while number >0

Given that information, if I only check validity for numericality, does Rails implicitly accept that as “must be present”? Because it is crucial that the database must allow null for all cases, but that Rails does not accept nil for this particular sub-model.

Thank you for the help so far

The docs I was referring to were Rails Guides, which I take for granted as THE docs. Thank you for the appropriate link!

The Guides are great, but definitely not all the documentation! :slight_smile: The api documentation is probably more vital to understanding how Rails actually works; after that it's straight into the code. :slight_smile:

Finally, just to clarify (because I want to make sure I understand):

1. The database allows NULL for :number_of_extensions 2. The sub-model requires :number_of_extensions to NOT be nil or blank 3. The sub model requires :number_of_extensions to be a [whole] number >0

Given that information, if I only check validity for numericality, does Rails implicitly accept that as "must be present"? Because it is crucial that the database must allow null for all cases, but that Rails does not accept nil for this particular sub-model.

The `validates_numericality_of` method has a few options, as you've seen. There are two that are important here, notably by *not* using them in your validation:

* `allow_nil` -- if you set this explicitly to `false` or leave out as   the default is `false`, that will ensure that the value under test   *must* not be nil, i.e., must be present.

* `allow_blank` -- like `allow_nil` but also allows in the case of a   numerical test a "blank" value, i.e., an empty string. Again,   explicitly setting it to `false` or leaving it out as the default is   `false` will ensure that your value under test cannot be an empty   string.

I'm pretty sure that covers the gamut of your needs, so to make it explicit, this is what you should have:

    validates_numericality_of :number_of_extensions, { only_integer: true, greater_than: 0}

And that will ensure the number of extensions MUST be a positive, whole number and can NOT be nil.

Thank you for the help so far

My pleasure. :slight_smile:

If you'll indulge me in a little more exposition, read Justin Weiss's ["Practicing Rails"](Practicing Rails: Learn Rails Without Getting Overwhelmed - Justin Weiss), most especially the first (free!) chapter, which defines exquisitely a practice of learning something. Breaking things down into a small, learnable chunk, by spooling up a small rails app expressly for that chunk serves me so well in studying, playing around with, explaining, and so on. Coupled with playing around in the rails console, especially when using pry, helps so much. It becomes easier to just try stuff out and see how it works, or doesn't!

> > Hello. I know the title may be broad, but I am not sure how else to

put it.

> > > > I am writing a model, in which the attribute "number_of_extensions"

needs 2 things:

> > 1. It is required for this model > > 2. It must be a whole, positive number > > > > I know I can do this simply by > > > > validates :number_of_extensions, presence: true, numericality: {

only_integer: true }

> > > > However, if I validate for JUST numericality, is it assumed that > > the attribute SHOULD be present? > > That is so; there is an option to allow nil or blank, but it is > false by default. As it needs to be positive, you should also > specify `greater_than: 0` in the options hash. > > > Also, while I am talking about validations, I have another question: > > > > I know that the following type of validations is not in the docs > > anymore, but it is still supported. Would the following line be > > possible? > > > > validates_numericality_of :number_of_extensions, :number_of_sidecars,

:number_of_phones, only_integer: true

> > I'm pretty sure that is still in: > >

http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_numericality_of

This clears up everything :slight_smile:

I do have the free chapter, and am subscribed to his weekly emails. I just need to take the time to sit down and read everything. His blog posts are very helpful though.

Again, thank you for the help!! :smiley: