PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

kesalahan multiparameter dengan datetime_select

Kristen. Ini adalah bug di Rails yang memeriksa database untuk menyimpulkan jenis yang diperlukan untuk atribut multiparameter. Dugaan saya adalah bahwa atribut "date_time" Anda tidak terkait dengan kolom waktu di database Anda.

Saya baru-baru ini mengatasi masalah ini di mana saya ingin atribut non-database ke atribut multiparameter yang diterima, ini adalah solusi terbaik yang bisa saya buat:

Saya mendapati diri saya ingin menetapkan attr_accessor untuk menangani pemberian tanggal ke model saya dalam form_for tag dengan f.datetime_select pembantu. Jadi ini yang saya punya:

Model:

attr_accessor :my_time

Lihat:

<%= f.datetime_select :my_time %>

Sayangnya ketika saya mengirimkan formulir saya, saya mendapatkan ini:

1 error(s) on assignment of multiparameter attributes

Nah ternyata ini sebenarnya bug Rails yang tiketnya sudah dikirimkan. Sementara itu bagaimana kita membuat ini bekerja? Satu-satunya solusi yang dapat saya temukan yang menarik dari jarak jauh adalah dengan menggunakan composed_of sebagai pengganti attr_accessor . jadi...

Model:

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

Saya hampir tidak tahu apa-apa tentang composed_of jadi Anda mungkin harus membaca sendiri tentangnya, tetapi yang saya tahu adalah bahwa itu menciptakan pembaca dan penulis untuk variabel instan yang diberikan, dan yang lebih penting, penyetel menerima atribut multiparameter. Bagaimana saya memilih opsi:

class_name:nama kelas yang diharapkan. Dalam hal ini, Time
mapping:argumen pertama adalah kelas dan argumen kedua tampaknya bekerja dengan metode apa pun yang ditanggapi oleh instance kelas. Saya memilih to_s konstruktor:Tidak begitu yakin bagaimana ini seharusnya bekerja. Tampaknya dipanggil ketika @my_time adalah nil .
converter:Tidak begitu yakin bagaimana ini seharusnya bekerja. Tampaknya dipanggil ketika dari my_time=, tetapi tampaknya tidak diterapkan dengan penugasan massal. Satu masalah yang saya hadapi dengan solusi ini adalah waktu diatur dalam UTC alih-alih zona waktu lingkungan. Jadi sayangnya kami tidak dapat menggunakan my_time secara langsung, tetapi harus mengubahnya ke zona waktu yang tepat:

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. di redshift postgresql dapatkah saya melewati kolom dengan fungsi salin?

  2. Tambahkan batasan datetime ke indeks parsial multi-kolom PostgreSQL

  3. Mengembalikan nilai dari MyBatis <insert> metode yang dipetakan

  4. Mengapa postgres tidak menggunakan indeks dalam kueri saya

  5. Permintaan ActiveRecord jauh lebih lambat daripada SQL langsung?