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

multiparameter fejl med datetime_select

Kristen. Dette er en fejl i Rails, der kontrollerer databasen for at udlede den nødvendige type for multiparameter-attributterne. Mit gæt er, at din "date_time"-attribut ikke er knyttet til en tidskolonne i din database.

Jeg tacklede for nylig dette problem, hvor jeg ønskede en ikke-database-attribut til accepterede multiparameter-attributter, dette var den bedste løsning, jeg kunne finde på:

Jeg fandt mig selv i at ville indstille en attr_accessor at håndtere at sende en dato til min model i en form_for tag med f.datetime_select hjælper. Så dette er hvad jeg havde:

Model:

attr_accessor :my_time

Vis:

<%= f.datetime_select :my_time %>

Desværre får jeg denne, når jeg indsender min formular:

1 error(s) on assignment of multiparameter attributes

Nå, det viser sig, at dette faktisk er en Rails-fejl, som en billet er blevet indsendt til. Hvordan får vi det til at fungere i mellemtiden? Den eneste løsning, jeg kunne finde, som var yderst attraktiv, var at gøre brug af composed_of som erstatning for attr_accessor . så...

Model:

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

Jeg ved næsten intet om composed_of metoden, så du burde nok lave din egen læsning på den, men hvad jeg ved er, at den opretter både en læser og en skribent til den givne instansvariabel, og endnu vigtigere, så accepterer sætteren multiparameter attributter. Hvordan jeg valgte mulighederne:

klasse_navn:navnet på vores forventede klasse. I dette tilfælde Time
mapping:det første argument er klassen, og det andet argument ser ud til at fungere med enhver metode, som en forekomst af klassen reagerer på. Jeg valgte to_s konstruktør:Ikke helt sikker på, hvordan dette skal fungere. Ser ud til at blive kaldt, når @my_time er nil .
konverter:Ikke helt sikker på, hvordan dette skal fungere. Ser ud til at blive kaldt fra min_tid=, men lader ikke til at blive anvendt med massetildeling. Et problem, jeg stødte på med denne løsning, var, at tiderne blev sat i UTC i stedet for miljøets tidszone. Så vi kan desværre ikke bruge min_tid direkte, men skal i stedet konvertere den til den rigtige tidszone:

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


  1. SQL Server heap v.s. klynget indeks

  2. Tilslutning til en database ved hjælp af PHP

  3. Postgres CASE-erklæring i et indlæg

  4. Sum top 5 værdier i MySQL