Поле даты и времени с использованием Rails на Postgres

Я использую Rails для создания приложения для планирования с Postgres. У меня есть модель Shift с двумя столбцами даты, start_at и end_at. Миграция для его создания следующая:

class CreateShifts < ActiveRecord::Migration
  def change
    create_table :shifts do |t|
      t.references :user
      t.references :schedule
      t.datetime :start_at
      t.datetime :end_at
      t.string :position
      t.string :notes

      t.timestamps
    end
    add_index :shifts, :user_id
    add_index :shifts, :schedule_id
  end
end

Когда я пытаюсь создать запись, я получаю следующую ошибку 500:

GError: ERROR:  column "end_at" is of type timestamp without time zone but expression is of type time without time zone at character 132
HINT:  You will need to rewrite or cast the expression.
: INSERT INTO "shifts" ("created_at", "end_at", "notes", "position", "schedule_id", "start_at", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"

Я создаю действительный объект DateTime перед сохранением БД, потому что я использовал регистратор для его отображения, и это правильно. Параметры выглядят так:

{"utf8"=>"✓",
 "authenticity_token"=>"qornHMTAdikZJP/sByPIg//fFuYHHAQH3M/0R9XnP+o=",
 "shift"=>{"user_id"=>"1",
 "start_at(1i)"=>"2011",
 "start_at(2i)"=>"11",
 "start_at(3i)"=>"14",
 "start_at(4i)"=>"00",
 "start_at(5i)"=>"01",
 "end_at(1i)"=>"2011",
 "end_at(2i)"=>"11",
 "end_at(3i)"=>"14",
 "end_at(4i)"=>"00",
 "end_at(5i)"=>"02",
 "position"=>"",
 "notes"=>""},
 "schedule_id"=>"1"}

Однако я могу создать запись через консоль, установив для обоих полей значение Time.now.


person Zac    schedule 13.11.2011    source источник


Ответы (1)


Сообщение об ошибке совершенно ясно: ваш $2 в операторе INSERT имеет тип time вместо типа timestamp (дата-время)

ВСТАВИТЬ В смены

(created_at, end_at, примечания, позиция, schedule_id, start_at, updated_at, user_id)

ЗНАЧЕНИЯ ($1, $2, $3, $4, $5, $6, $7, $8) ВОЗВРАЩЕНИЕ id

Акцент мой. Вы, должно быть, путаете параметры, $2 явно не тот, который вы показываете в конце своего поста. Или вы непреднамеренно указали время перед назначением. Та часть, где вы присваиваете $2, не видна в вопросе, именно там и возникает проблема, скорее всего.

Может быть, какая-то опечатка, как в вашем вопросе, где вы упоминаете timedate вместо datetime?

person Erwin Brandstetter    schedule 14.11.2011
comment
На самом деле мне просто нужно было перезапустить Thin. Даже в режиме разработки миграция для изменения столбца с time на datetime не вступила в силу, поэтому он пытался сохранить time в поле. - person Zac; 14.11.2011
comment
Та же проблема здесь - мне просто пришлось перезапустить сервер rails - не знаю, почему вы приняли ответ Эрвина - ответ, кажется, является вашим комментарием к перезапуску вашего сервера. - person ryan2johnson9; 04.08.2016