2017-01-23 2 views
0

Я создаю приложение для рельсов, где пользователь берет дату с даты выбора и время от таймера. И дата и время отформатирована момент JS, чтобы показать дату и время следующим образом:Тип столбцов Rails для даты и времени форматирования момента.js

moment().format('LL'); //January 23,2017 
moment().format('LTS'); //1:17:54 PM 

Я прочитал этот ответ с руководящими принципами о выборе правильного типа столбца. Is there documentation for the Rails column types?

В идеале, я должен использовать: date,: time или: timestamp для этого. Но поскольку даты отформатированы, следует ли использовать: string вместо?

Какой будет правильный и подходящий тип столбца для использования в этой ситуации?

ответ

1

Если вы хотите сохранить ссылку времени в базе данных, вы должны использовать один из типов базы данных предоставляют вам. Я объясню это с помощью MySQL (именно тот, который я использовал больше всего), но объяснение должно быть похоже на других серверах баз данных.

  • Если вы используете timestamp столбец, который будет использоваться только 4 байт памяти, который всегда хороший новый, так как это делает меньшие показатели, использует меньше памяти во временных таблицах во внутренних операций базы данных и так далее. Тем не менее, timestamp имеет меньший диапазон, чем datetime, так что вы сможете только для хранения значений с 1970 года до 2038 года более или менее

  • Если вы используете datetime вы будете иметь возможность хранить более широкий диапазон (от 1001 года до 9999 г.) с той же точностью (второй). Плохое следствие заключается в том, что для более высокого диапазона требуется больше памяти, что делает его немного медленнее.

Существуют и другие различия между этими двумя типами столбцов, которые не соответствуют этому ответу, но вы должны следить за тем, чтобы решить.

  • Если вы используете varchar, который является типом столбца по умолчанию для атрибутов текста в Ruby On Rails, вы будете вынуждены конвертировать из текста в DateTime и наоборот каждый раз, когда вам нужно использовать это поле. Кроме того, упорядочение или фильтрация в этом столбце будет очень неэффективной, поскольку базе данных необходимо будет преобразовать все строки в даты перед фильтрацией или сортировкой, что делает невозможным использование индексов в этом столбце.

  • Если вам нужно суб-секундный точность, вы можете использовать bigint, чтобы удовлетворить ваши требования, поскольку MySQL не обеспечивает дату определенного типа для этой цели

В общем, я рекомендую использовать timestamp если ваш требования к применению соответствуют ограничению timestamp. В противном случае используйте datetime, но я решительно препятствую вам использовать varchar для этой цели.

EDIT: Форматирование

Путь хранить даты в базе данных полностью отличается от того, как вы отобразить его пользователю. Вы можете создать объект DateTime, используя DateTime.new(year, month, day, hour, minute, second) и назначить этот объект своей модели. Когда вы сохраните его в базе данных, ActiveRecord будет отвечать за преобразование объекта DateTime в соответствующий формат базы данных.

Чтобы отобразить значение, которое уже хранится в базе данных в определенном формате (в представлении, ответе API и т. Д.), Вы можете просмотреть другие сообщения, например this one.

+0

Спасибо! Нужно ли мне преобразовать дату в любом конкретном формате для ее сохранения: timestamp или: datetime? Потому что я получу дату как месяц DD, YYYY и время как часы: min: sec am/pm от пользователя –

1

Вы можете иметь столбец временной метки в базе данных, а затем разобрать запрос на объект рубин даты и времени, как это:

d = Time.parse(params[:date]) 
t = Time.new(params[:time]) 
dt = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec, t.zone) 
#now simply use dt to your datetime column 

На Postgres вы можете сохранить объект рубин DateTime прямо в Postgres временных меток поля, например

User.first.update_attribute('updated_at', dt) 

Другой вариант заключается в сцепить ваши даты и времени строки в одну, а затем и может сделать один-лайнер:

User.last.update_attribute('created_at', Time.parse('January 23,2017 1:17:54 PM')) 

Я уверен, что это будет работать с MySQL datetime или timestamp.

Кредит Давид Грейсон Ruby: combine Date and Time objects into a DateTime

+0

Итак, у меня есть дата, отформатированная любым способом, хранящаяся под типом столбца даты:? Разве нет конкретного формата, в котором должна быть дата? –

+0

нет даты, так как вы хотите дату и время. использовать ли временную метку или дату-время для столбца –

+0

любое другое форматирование? Как удаление запятой и всех? –

Смежные вопросы