PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

многопараметрична грешка с datetime_select

Кристиян. Това е грешка в Rails, която проверява базата данни, за да заключи типа, необходим за многопараметричните атрибути. Предполагам, че вашият атрибут "date_time" не е свързан с колона за време във вашата база данни.

Наскоро се заех с този проблем, където исках атрибут без база данни към приетите многопараметрични атрибути, това беше най-доброто решение, което можах да измисля:

Открих, че искам да задам attr_accessor за обработка на предаването на дата към моя модел в form_for етикет с f.datetime_select помощник. Ето какво имах:

Модел:

attr_accessor :my_time

Изглед:

<%= f.datetime_select :my_time %>

За съжаление, когато изпратя формуляра си, получавам това:

1 error(s) on assignment of multiparameter attributes

Е, оказва се, че това всъщност е грешка в Rails, за която е подаден билет. Междувременно как да накараме това да работи? Единственото решение, което можех да намеря и което беше отдалечено привлекателно, беше да използвам composed_of като заместител на attr_accessor . така...

Модел:

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

Не знам почти нищо за composed_of метод, така че вероятно трябва да направите свое собствено четене върху него, но това, което знам е, че той създава както четец, така и писател за дадена променлива на екземпляр, и което е по-важно, сетерът приема многопараметрични атрибути. Как избрах опциите:

class_name:името на нашия очакван клас. В този случай, Time
картиране:първият аргумент е класът, а вторият аргумент изглежда работи с всеки метод, на който отговаря екземпляр на класа. Избрах to_s конструктор:Не съм много сигурен как трябва да работи това. Изглежда, че се извиква, когато @my_time е nil .
конвертор:Не съм много сигурен как трябва да работи това. Изглежда, че се извиква, когато от my_time=, но не изглежда, че се прилага с масово присвояване. Един проблем, който срещнах с това решение, беше, че времената се задаваха в UTC вместо в часовата зона на средата. Така че за съжаление не можем да използваме my_time директно, а вместо това трябва да го преобразуваме в правилната часова зона:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете n-gram в postgresql

  2. Вземете списък на всички използвани таблици в заявка за SELECT на Postgresql

  3. първичният ключ автоматично ли се индексира в postgresql?

  4. Календарни таблици в PostgreSQL 9

  5. Получаване на резултати между две дати в PostgreSQL