PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

błąd wieloparametrowy z datetime_select

Chrześcijanin. Jest to błąd w Railsach, który sprawdza bazę danych w celu wywnioskowania typu potrzebnego dla atrybutów wieloparametrowych. Domyślam się, że Twój atrybut „data_godzina” nie jest powiązany z kolumną czasu w Twojej bazie danych.

Niedawno rozwiązałem ten problem, w którym chciałem, aby atrybut niebędący bazą danych był akceptowany atrybutami wieloparametrowymi, było to najlepsze rozwiązanie, jakie mogłem wymyślić:

Zorientowałem się, że chcę ustawić attr_accessor do obsługi przekazywania daty do mojego modelu w form_for tag z f.datetime_select pomocnik. Oto co miałem:

Model:

attr_accessor :my_time

Widok:

<%= f.datetime_select :my_time %>

Niestety, kiedy przesyłam formularz, otrzymuję to:

1 error(s) on assignment of multiparameter attributes

Okazuje się, że jest to w rzeczywistości błąd Railsowy, na który zgłoszono zgłoszenie. W międzyczasie jak to działa? Jedynym rozwiązaniem, które udało mi się znaleźć, które było zdalnie atrakcyjne, było skorzystanie z composed_of jako zamiennik dla attr_accessor . więc...

Model:

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

Prawie nic nie wiem o composed_of metody, więc prawdopodobnie powinieneś zrobić na niej własny odczyt, ale wiem, że tworzy ona zarówno czytnik, jak i zapis dla danej zmiennej instancji, a co ważniejsze, ustawiacz akceptuje atrybuty wieloparametrowe. Jak wybrałem opcje:

class_name:nazwa naszej oczekiwanej klasy. W tym przypadku Time
mapowanie:pierwszym argumentem jest klasa, a drugi argument wydaje się działać z każdą metodą, na którą odpowiada instancja klasy. Wybrałem to_s konstruktor:Nie jestem do końca pewien, jak to ma działać. Wygląda na to, że jest wywoływany, gdy @my_time jest nil .
konwerter:Nie jestem pewien, jak to ma działać. Wydaje się, że wywoływana jest kiedy from my_time=, ale nie wydaje się być stosowana z przypisaniem masowym. Jednym z problemów, na który natknąłem się z tym rozwiązaniem, było to, że czasy były ustawiane w UTC zamiast w strefie czasowej środowiska. Dlatego niestety nie możemy użyć my_time bezpośrednio, ale zamiast tego musimy przekonwertować go na właściwą strefę czasową:

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. Jak współdziałają funkcje okna i klauzula group by?

  2. Dodaj brakujący miesiąc w wyniku z wartościami z poprzedniego miesiąca

  3. Sprzężenie wewnętrzne kontra robienie gdzie w klauzuli

  4. Błąd uwierzytelnienia hasła podczas uruchamiania migracji laravel

  5. Przekroczono limit czasu połączenia PostgreSQL OperationalError na Django i nowym serwerze