Tengo un modelo con algunos atributos y un atributo virtual. Este atributo virtual se usa para crear una casilla de verificación en el formulario de creación.Escriba un atributo virtual del modelo ActiveRecord
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
end
Puesto que el campo es una casilla de verificación en la forma, el atributo foo
recibirá '0'
o '1'
como valor. Me gustaría que sea un valor lógico debido al código siguiente:
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
before_validation :set_default_bar
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
El problema aquí es que la condición se cumplirá incluso cuando foo
es '0'
. Me gustaría utilizar el mecanismo de conversión de tipo ActiveRecord pero el único que he encontrado para hacerlo es la siguiente:
class Thing < ActiveRecord::Base
attr_reader :foo
attr_accessible :foo
before_validation :set_default_bar
def foo=(value)
@foo = ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
Pero me siento sucia hacerlo de esa manera. ¿Hay una mejor alternativa sin volver a escribir el método de conversión?
Gracias
Porque los valores podrían cambiar a ''true'' y'' false'' y todavía debería funcionar. Rails lo hace bien, pero en el lugar equivocado en mi humilde opinión. – Happynoff
Acerca de la configuración de @bar en 'foo =' Creo que no es el lugar para hacerlo, principio de responsabilidad única y todo. Y, en mi caso de uso real, tiene sentido colocarlo antes de la validación;) – Happynoff
Tienes razón. Usted tiene esta solución: https://gist.github.com/2000623 pero no creo que sea una solución mejor. Básicamente es lo mismo que los rieles. Ver la fuente: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/column.rb – Dougui