DEV Community

Cover image for Ruby Active Record Validations Intro
logan-lampton
logan-lampton

Posted on

Ruby Active Record Validations Intro

It's a powerful feeling once we have our database up and running and able to take the data provided by our users and persistently save that data on the backend. But how can we make sure that the user provides the data that we need and only in a format that makes sense for comparing with the rest of the information in our database? For example, we want to make sure that users provide a username and password when signing up for an account on our website and can't just leave the password input blank. That's where validations come in!

First let's take a look at where validations are located in Ruby active record. You'll be adding any validations you create to the app/models file.

Image description

In our example, we are creating a very important database for dogs wearing hats, so we will add our validations to the file: app/models/hatdogs which is currently blank:

class Hatdog < ApplicationRecord
end

Enter fullscreen mode Exit fullscreen mode

Image description
Behold a Hatdog! (Photo by Meghan Hessler on Unsplash)

Before we add our validations, we'll want to take a look at what kind of data we are looking for. This can be found in our schema or Hatdog migration.

class CreateHatdogs < ActiveRecord::Migration[7.0]
  def change
    create_table :hatdogs do |t|
      t.string :name
      t.integer :age
      t.string :image
      t.string :catchphrase

      t.timestamps
    end
  end
end
Enter fullscreen mode Exit fullscreen mode

We want a name, age, image and catchphrase for each object. All of these will have the type of string, except for age. For each validation, we will use the "validates" keyword.

Presence
If we want to make sure that when users go to add a new Hatdog on the front-end, that they provide a name, age and image, we can easily do so with the presence: true validation, like so.

class Hatdog < ApplicationRecord

    validates :name, presence: true
    validates :age, presence: true
    validates :image, presence: true

end
Enter fullscreen mode Exit fullscreen mode

Numericality
We'd like for users to only use integers for age, so that we stop getting things like "Old!" submitted to our database. We can use numericality for that. Let's add it to our current validation for :age.

class Hatdog < ApplicationRecord

    validates :name, presence: true
    validates :age, presence: true, numericality: { only_integer: true }
    validates :image, presence: true

end
Enter fullscreen mode Exit fullscreen mode

Image description
Definitely not too old! (Photo by Manda Hansen on Unsplash)

greater_than_or_equal_to and less_than_or_equal_to
Let's add some more validations to age, so that we don't get crazy numbers like -1 and 1000.

class Hatdog < ApplicationRecord

    validates :name, presence: true
    validates :age, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 25 }
    validates :image, presence: true

end

Enter fullscreen mode Exit fullscreen mode

Uniqueness
Let's say we want each picture to be unique to prove we have different Hatdogs. (We're not going down the rabbit hole of hoping that each dog name is completely unique!) To make sure the user input is unique, we'll use uniqueness.

class Hatdog < ApplicationRecord

    validates :name, presence: true
    validates :age, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 25 }
    validates :image, presence: true, uniqueness: true

end
Enter fullscreen mode Exit fullscreen mode

Length

Let's add a validation for the catchphrase! We don't want users submitting an essay, so let's limit how long the catchphrase can be to a maximum of 150 characters.

class Hatdog < ApplicationRecord

    validates :name, presence: true
    validates :age, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 25 }
    validates :image, presence: true, uniqueness: true
    validates :catchphrase, length: { maximum: 150 }

end
Enter fullscreen mode Exit fullscreen mode

Image description
Catchphrase: "I let the dogs out" (Photo by Jamie Street on Unsplash)

This is just the beginning of all the helpful ways that validations can help you keep your data clean and useful. For more information to help with your continued development, please take a look at the official Ruby documentation. It's great (if a little lacking in dog images) read: https://guides.rubyonrails.org/active_record_validations.html

Happy coding!

Top comments (0)