En Ruby on Rails existe un validador con el nombre de absence, este la primera vez que lo vi pensé "¿Para que quiere comprobar que un valor no existe?" Pero luego leyendo este post me ha parecido útil a la hora de definir campos en el modelo que se encuentran en la base de datos y esta los genera automáticamente. Como por ejemplo un ID
class User
include ActiveModel::Validations
attr_accessor :id, :name
validates :id, absence: true
end
De esta forma modelamos que el usuario tiene un ID pero no puede ser impuesto desde el la aplicación, lo dejamos para la base de datos.
De tal manera que si comprobamos si el objeto que hemos creado es válido o no, uno de los puntos que tendrá en cuenta será que tiene que tener el ID en este caso vacío.
user = User.new
user.valid?
# => true
user.id = 1
user.valid?
# => false
Este ejemplo no es bueno ya que el ID lo genera rails automáticamente y debe de estar presente siempre en la base de datos. Esto generará un problema si hacemos lo siguiente.
user = User.new
user.name = 'Pepe'
user.save
# save on database
user = User.last
# id: 1 name: Pepe
user.name = 'Antonio'
user.save
# error id should be blank
user.id = nil
# error from database, id can't be null
Al tener la restricción en el modelo de que el ID tiene que ser vacío en el momento de la creación y el primer guardado en la base de datos no hay problema pero si cargamos un usuario para modificarlo nos obliga la aplicación a que sea vacío el ID y al guardarlo en la base de datos no puede ejecutar la sentencia SQL.