sql >> Databasteknik >  >> RDS >> PostgreSQL

multiparameterfel med datetime_select

Christian. Detta är en bugg i Rails som kontrollerar databasen för att sluta sig till vilken typ som behövs för multiparameterattributen. Min gissning är att ditt "date_time"-attribut inte är kopplat till en tidskolumn i din databas.

Jag tacklade nyligen det här problemet där jag ville ha ett icke-databasattribut till accepterade multiparameterattribut, detta var den bästa lösningen jag kunde komma på:

Jag kom på mig själv med att vilja ställa in en attr_accessor att hantera att skicka ett datum till min modell i en form_for taggen med f.datetime_select hjälpare. Så det här är vad jag hade:

Modell:

attr_accessor :my_time

Visa:

<%= f.datetime_select :my_time %>

Tyvärr när jag skickar in mitt formulär får jag detta:

1 error(s) on assignment of multiparameter attributes

Det visar sig att detta faktiskt är en Rails-bugg som en biljett har skickats in för. Hur får vi det här att fungera under tiden? Den enda lösning jag kunde hitta som var avlägset attraktiv var att använda composed_of som ersättning för attr_accessor . så...

Modell:

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

Jag vet nästan ingenting om composed_of metod så du borde förmodligen göra din egen läsning på den, men vad jag vet är att den skapar både en läsare och en skribent för den givna instansvariabeln, och ännu viktigare, sättaren accepterar multiparameterattribut. Hur jag valde alternativen:

class_name:namnet på vår förväntade klass. I det här fallet, Time
mappning:det första argumentet är klassen och det andra argumentet verkar fungera med vilken metod som helst som en instans av klassen svarar på. Jag valde to_s konstruktör:Inte riktigt säker på hur det här ska fungera. Verkar anropas när @my_time är nil .
omvandlare:Inte riktigt säker på hur det här ska fungera. Verkar kallas när från my_time=, men verkar inte tillämpas med masstilldelning. Ett problem som jag stötte på med den här lösningen var att tiderna ställdes in i UTC istället för miljöns tidszon. Så tyvärr kan vi inte använda my_time direkt, utan måste istället konvertera den till rätt tidszon:

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


  1. left join med villkor för höger tabell i mysql

  2. Hur beräknar jag motsvarande SQL Server (hashbytes('SHA1',[ColumnName])) i C#?

  3. Ansluter PowerShell till Salesforce.com

  4. Behöver en insättningstrigger ett commit-uttalande