Le validazioni vivono nel Model e bloccano il salvataggio se i dati non rispettano le regole. Sono la garanzia che nel database non finisca spazzatura.

class Launch < ApplicationRecord
  validates :name, presence: true
  validates :name, uniqueness: true
  validates :provider, presence: true
  validates :status, inclusion: { in: %w[scheduled success failure] }
end

launch = Launch.new
launch.save          # => false
launch.errors.full_messages # => ["Name can't be blank", ...]
launch.save!         # solleva un'eccezione invece di restituire false

save restituisce false se una validazione fallisce; save! solleva un'eccezione. In errors trovi i messaggi da mostrare all'utente.

Attenzione: le validazioni proteggono a livello applicativo. Per garanzie ferree (unicità sotto concorrenza) aggiungi anche un indice unico nel database.