PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Multiparameterfehler bei datetime_select

Christian. Dies ist ein Fehler in Rails, der die Datenbank überprüft, um den Typ abzuleiten, der für die Multiparameter-Attribute benötigt wird. Ich vermute, dass Ihr "date_time"-Attribut nicht mit einer Zeitspalte in Ihrer Datenbank verknüpft ist.

Ich habe mich kürzlich mit diesem Problem befasst, bei dem ich ein Nicht-Datenbankattribut für akzeptierte Multiparameterattribute haben wollte. Dies war die beste Lösung, die ich finden konnte:

Ich wollte einen attr_accessor setzen um ein Datum in einem form_for an mein Modell zu übergeben Tag mit dem f.datetime_select Helfer. Das hatte ich also:

Modell:

attr_accessor :my_time

Ansicht:

<%= f.datetime_select :my_time %>

Leider erhalte ich beim Absenden meines Formulars Folgendes:

1 error(s) on assignment of multiparameter attributes

Nun, es stellt sich heraus, dass dies tatsächlich ein Rails-Bug ist, für den ein Ticket eingereicht wurde. Wie machen wir das in der Zwischenzeit? Die einzige Lösung, die ich finden konnte, die auch nur annähernd attraktiv war, war die Verwendung von composed_of als Ersatz für attr_accessor . also...

Modell:

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

Ich weiß fast nichts über composed_of -Methode, also sollten Sie wahrscheinlich selbst darüber lesen, aber was ich weiß, ist, dass es sowohl einen Leser als auch einen Schreiber für die angegebene Instanzvariable erstellt, und was noch wichtiger ist, der Setter akzeptiert Attribute mit mehreren Parametern. Wie ich die Optionen gewählt habe:

class_name:der Name unserer erwarteten Klasse. In diesem Fall Time
Zuordnung:Das erste Argument ist die Klasse und das zweite Argument scheint mit jeder Methode zu funktionieren, auf die eine Instanz der Klasse antwortet. Ich habe mich für to_s entschieden Konstrukteur:Ich bin mir nicht sicher, wie das funktionieren soll. Scheint aufgerufen zu werden, wenn @my_time ist nil .
converter:Ich bin mir nicht ganz sicher, wie das funktionieren soll. Scheint wann von my_time=aufgerufen zu werden, scheint aber nicht mit Massenzuweisung angewendet zu werden. Ein Problem, auf das ich bei dieser Lösung gestoßen bin, war, dass Zeiten in UTC statt in der Zeitzone der Umgebung eingestellt wurden. Leider können wir my_time nicht direkt verwenden, sondern müssen es stattdessen in die richtige Zeitzone umwandeln:

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