PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

errore multiparametrico con datetime_select

Cristiano. Questo è un bug in Rails che controlla il database per dedurre il tipo necessario per gli attributi multiparametro. La mia ipotesi è che il tuo attributo "date_time" non sia associato a una colonna dell'ora nel tuo database.

Di recente ho affrontato questo problema in cui volevo che un attributo non di database accettasse attributi multiparametro, questa era la soluzione migliore che potevo trovare:

Mi sono ritrovato a voler impostare un attr_accessor per gestire il passaggio di una data al mio modello in un form_for tag con f.datetime_select aiutante. Quindi questo è quello che avevo:

Modello:

attr_accessor :my_time

Visualizza:

<%= f.datetime_select :my_time %>

Sfortunatamente quando invio il mio modulo ottengo questo:

1 error(s) on assignment of multiparameter attributes

Bene, si scopre che questo è in realtà un bug di Rails per il quale è stato inviato un ticket. Nel frattempo come facciamo a farlo funzionare? L'unica soluzione che ho trovato lontanamente interessante è stata quella di utilizzare composed_of in sostituzione di attr_accessor . allora...

Modello:

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

Non so quasi nulla del composed_of metodo quindi dovresti probabilmente fare la tua lettura su di esso, ma quello che so è che crea sia un lettore che uno scrittore per la variabile di istanza data e, cosa più importante, il setter accetta attributi multiparametro. Come ho scelto le opzioni:

class_name:il nome della nostra classe prevista. In questo caso, Time
mappatura:il primo argomento è la classe e il secondo argomento sembra funzionare con qualsiasi metodo a cui risponde un'istanza della classe. Ho scelto to_s costruttore:Non sono proprio sicuro di come dovrebbe funzionare. Sembra essere stato chiamato quando @my_time è nil .
convertitore:non sono sicuro di come dovrebbe funzionare. Sembra essere chiamato quando da my_time=, ma non sembra essere applicato con l'assegnazione di massa. Un problema che ho riscontrato con questa soluzione era che gli orari venivano impostati in UTC anziché nel fuso orario dell'ambiente. Quindi sfortunatamente non possiamo usare my_time direttamente, ma dobbiamo invece convertirlo nel fuso orario corretto:

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