update_all update rails generate create attribute active ruby-on-rails ruby activerecord model update-attributes

ruby-on-rails - generate - rails update attribute



problema con pasar booleanos a atributos_actualizados (3)

Tengo el siguiente modelo:

class GuestCatering < ActiveRecord::Base # Validation validates :name, :presence => true validates :order_number, :presence => true validates :orderable, :presence => true end

Pero cuando intente actualizar un GuestCatering existente con el siguiente código:

guest_catering.update_attributes(:orderable => false)

La variable de catering de invitados es un objeto válido de GuestCatering. El objeto guest_catering tiene errores después de la actualización, así:

<{[:orderable, ["can''t be blank"]]=>nil}>

Pero cuando paso un orderable => true , todo está bien y no hay errores.

¿Qué pasa aquí, por qué no puedo configurar orderable a falso?


Como ya dijo Dan Cheail en su respuesta, un booleano nil y false es semánticamente la misma cosa.

Pero, si realmente necesita validarlo (no permite nada), siempre puede hacer:

validates_inclusion_of :orderable, :in => [true, false]


En lugar de validates :presence => :true , debe escribir sus migraciones con el valor predeterminado de esta manera:

t.boolean :orderable, :default => 0

Supongo que su valor predeterminado debe ser false . Si es true , use 1 como predeterminado. Luego establecerá el valor predeterminado en la base de datos. Por lo tanto, puede omitir la verificación de validación.

La razón por la que no puede usar validates :presence es respondida por @dan. La presencia significa que no está en blanco y los rieles usan .blank? función para esto y false.blank? es true


Su modelo se está comportando exactamente como se lo indicó, mediante el uso de validates :orderable, :presence => true

No tiene mucho sentido validar la presencia de una bandera booleana: va a ser true , nil o false , y en Ruby world, nil y false tienen el mismo valor semántico en lo que respecta a la lógica booleana.

Internamente, validates :presence basa en el valor del atributo que se está comprobando para devolver false cuando está en blank? se llama. Y, en Rails (con ActiveSupport), false.blank? se evalúa como true , lo que significa que su campo está fallando en la validación.

Simplemente elimine esa validación y todo funcionará como se espera.