Tengo 3 campos en mi formulario que no están en mi base de datos: tipo_inicio, horas_iniciativas, apertura_minutos. Quiero actualizar el atributo principal "apertura" (en la base de datos) con estos 3 campos.Rieles - Agregar atributos que no están en el modelo y actualizar el atributo del modelo
Probé muchas cosas que no funcionan.
En realidad tengo:
attr_accessor :opening_type, :opening_hours, :opening_minutes
def opening_type=(opening_type)
end
def opening_type
opening_type = opening.split("-")[0] if !opening.blank?
end
def opening_hours=(opening_hours)
end
def opening_hours
opening_hours = opening.split("-")[1] if !opening.blank?
end
def opening_minutes=(opening_minutes)
end
def opening_minutes
opening_minutes = opening.split("-")[2] if !opening.blank?
end
He intentado añadir algo como:
def opening=(opening)
logger.info "WRITE"
if !opening_type.blank? and !opening_hours.blank? and opening_minutes.blank?
opening = ""
opening << opening_type if !opening_type.blank?
opening << "-"
opening << opening_hours if !opening_hours.blank?
opening << "-"
opening << opening_minutes if !opening_minutes.blank?
end
write_attribute(:opening, opening)
end
def opening
read_attribute(:opening)
end
embargo, los métodos descriptores de acceso no son llamados y creo que opening_type, opening_hours, opening_minutes estaban vacías también si los descriptores de acceso se llamaron ...
Creo que no necesito una devolución de llamada before_save y debería hacer esto reescribiendo los accesadores.
Notas: - Rails 3.0.5, - opening_type, opening_hours:,: opening_minutes podrían estar vacía
EDIT: He actualizado mi código
Tenga en cuenta que esta respuesta asume que solo desea almacenar el campo combinado 'apertura' en la base de datos. Otro enfoque sería almacenar los componentes individuales en la base de datos y construir la cadena combinada dinámicamente a pedido. Dependiendo de sus requisitos, puede ser un mejor enfoque para usted. – Gareth
Obtengo esta base de datos con el campo de apertura. Esta base de datos se sincroniza con una aplicación de teléfono inteligente y no puedo cambiar su estructura para almacenar los 3 campos diferentes. ;-) El problema con una devolución de llamada before_validation es que no maneja el caso cuando vamos a editar el formulario ... y donde tengo que truncar el campo de apertura en 3 vars ... para el formulario. Sé que puedo hacerlo manualmente pero pensé que había un mejor enfoque para hacerlo con los accesorios ... –
Todo es cierto, pero su sugerencia de anular 'opening =' romperá muchas cosas. Además, es una idea muy esquemática tener un método setter que descarte totalmente el parámetro que se transfiere. Es mejor tener un método separado (como mi 'set_opening') que aclare lo que está haciendo. Usted no * tiene * que usar antes de la validación para llamar a ese método, pero le recomiendo seriamente que sea un método diferente – Gareth