Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

RubyMine: Database tool windowで日付や日時がエポックミリ秒になったときの対処法

RubyMineのDatabase tool windowで、テーブルのセル(GUI)に日付や日時を直接入力すると、Submitした時点でエポックミリ秒に変換されることがありました。

Railsアプリから見たとき、属性のクラスはIntegerになっており、DateDatetimeだと思って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から入力しても、エポックミリ秒に変換されなくなります。

関連記事

Linux環境のRubyMine(IntelliJ IDEA)で表示サイズを拡大させる方法



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。