RubyMineのDatabase tool windowで、テーブルのセル(GUI)に日付や日時を直接入力すると、Submitした時点でエポックミリ秒に変換されることがありました。
Railsアプリから見たとき、属性のクラスはInteger
になっており、Date
やDatetime
だと思ってI18n.l
などするとエラーになります。
irb(main):001:0> published_on = Book.first.published_on
Book Load (0.2ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT ? [["LIMIT", 1]]
irb(main):002:0> published_on.class
=> Integer
irb(main):003:0> I18n.l(published_on)
Traceback (most recent call last):
1: from (irb):7
I18n::ArgumentError (Object must be a Date, DateTime or Time object. 1578355200000 given.)
発生する条件
上記現象が発生した時点での、私の作業環境は以下の通りです。
- IDE: RubyMine(2020.3)
- DBMS: SQLite(3.28.0)
細かい発生条件まで絞りきれていないのですが、以下のことは確認しています。
- IntelliJ IDEA(2020.3)でも発生します。他のJetBrains IDEで発生するかは未確認です
- PostgreSQL(11.6)では発生しません。他のDBMSで発生するかは未確認です
対処法
SQLiteが関係しているのではと思い調べていたら、YouTrackで関連issueを見つけました。
Hi! You should set date_class to text if you want dates to be stored as text. Data Source Settings -> advanced -> date_class -> text.
youtrack.jetbrains.comより
DataGripの話ではありますが、 Data Source Settings
(> SQLite
) > Advanced
> date_class
の設定が直接の原因のようです。
RubyMineでも確認したところ、date_class
の説明には「integer
(デフォルト)ではUnix Epochからの秒またはミリ秒のnumberとしてdatesを保存する」と書いてあります。
今回の現象と一致しますね。
対処法としては、空欄になっているValueをTEXT
にすればよいです。
これで日付や日時をGUIから入力しても、エポックミリ秒に変換されなくなります。