sql >> Base de Datos >  >> RDS >> PostgreSQL

error multiparámetro con datetime_select

Cristiano. Este es un error en Rails que verifica la base de datos para inferir el tipo necesario para los atributos de varios parámetros. Supongo que su atributo "date_time" no está asociado con una columna de tiempo en su base de datos.

Recientemente abordé este problema en el que quería un atributo que no fuera de la base de datos para los atributos de varios parámetros aceptados, esta fue la mejor solución que se me ocurrió:

Me encontré queriendo establecer un attr_accessor para manejar pasar una fecha a mi modelo en un form_for etiqueta con el f.datetime_select ayudante. Así que esto es lo que tenía:

Modelo:

attr_accessor :my_time

Ver:

<%= f.datetime_select :my_time %>

Desafortunadamente, cuando envío mi formulario, aparece esto:

1 error(s) on assignment of multiparameter attributes

Bueno, resulta que en realidad se trata de un error de Rails para el que se envió un ticket. Mientras tanto, ¿cómo hacemos que esto funcione? La única solución que pude encontrar que era remotamente atractiva fue hacer uso de composed_of como reemplazo de attr_accessor . entonces...

Modelo:

  composed_of :my_time,
              :class_name => 'Time',
              :mapping => %w(Time to_s),
              :constructor => Proc.new{ |item| item },
              :converter => Proc.new{ |item| item }

No sé casi nada sobre el composed_of método por lo que probablemente debería hacer su propia lectura en él, pero lo que sí sé es que crea tanto un lector como un escritor para la variable de instancia dada y, lo que es más importante, el setter acepta atributos de parámetros múltiples. Cómo elegí las opciones:

class_name:el nombre de nuestra clase esperada. En este caso, Time
mapeo:el primer argumento es la clase y el segundo argumento parece funcionar con cualquier método al que responda una instancia de la clase. Elegí to_s constructor:No estoy muy seguro de cómo se supone que funciona esto. Parece ser llamado cuando @my_time es nil .
convertidor:no estoy muy seguro de cómo se supone que funciona. Parece que se llama cuando desde my_time=, pero no parece aplicarse con la asignación masiva. Un problema que encontré con esta solución fue que las horas se estaban configurando en UTC en lugar de la zona horaria del entorno. Desafortunadamente, no podemos usar my_time directamente, sino que debemos convertirlo a la zona horaria adecuada:

Time.zone.parse(my_time.to_s(:number))