Rails

【Rails】Rails6からtimestampsにデフォルトで追加されたprecisionオプションまとめ

Rails

 

今回はRails6からtimestampsにデフォルトで追加されるようになったオプション、precisionオプションについて簡単にまとめたので紹介したいと思います。より細かくデータを保管したい、日時データの精度を高めたいといった場合はprecisionオプションの付与はマストにした方が良さそうです。

precisionオプションとは

precisionオプションとは、小数点第何位まで計測するかどうかを設定するオプションです。precision: 3は小数点第3位まで、precision: 6は小数点第6位まで計測してくれることになります。

以下の結果を見てみても、presicion: 3の場合は小数点第3位(.848)まで、precision: 6の場合は小数点第6位(.267794)まで取得していることが分かります。その一方でprecisionオプション未定義の場合は、小数点以下を取得していません。

# precision: 3の場合

% rails c
> User.find(1).created_at
=> Sun, 22 Aug 2021 12:11:45.848000000 JST +09:00
# precision: 6の場合

% rails c
> User.find(1).created_at
=> Thu, 19 Aug 2021 17:57:05.267794000 JST +09:00
# precisionオプション未定義の場合

% rails c
> User.find(1).created_at
=> Sun, 22 Aug 2021 12:54:52.000000000 JST +09:00

Rails6以前とRails6のtimestamps

Rails6以前とRails6のtimestamps(created_atとupdated_at)について見比べてみます。下記の結果を見てみると、Rails6以前にはtimestampsにprecision: 6が付いておらず、Rails6にはprecision: 6が付与されていることが分かると思います。

このようにRails6のtimestampsには、デフォルトでprecision: 6が付与されるようになりました。

# Rails6以前

create_table "users", charset: "utf8mb4", force: :cascade do |t|
  t.string "name", null: false
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end
# Rails6

create_table "users", charset: "utf8mb4", force: :cascade do |t|
  t.string "name", null: false
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
end

precisionオプションのメリット・デメリット

precisionオプションのメリットは、カラム検索の精度が上がることになります。

例えばdatetimeカラムで条件分岐をするため、以下のような記述をしたと仮定します。

patient.created_atが23:59:59を数秒過ぎていた場合(23:59:59.9999など)、precisionオプションを設定していないと検索条件に引っかかってくれません。一方でprecisionオプションを設定すると小数点以下まで検索してくれるため、検索条件に引っかかります。

if patient.created_at > 23:59:59
  puts 'OK'
else
  puts 'NG'
end

 

precisionオプションのデメリットを挙げるとするならば、それは1レコードあたりのバイト数が増えることになります。しかしこのバイト数の増加は大した数ではないため、あまり気にする必要はないかと思います。

precisonオプションはどこで使用するべきか

datetime型カラムには無条件でprecision: 6を付与するべきです。

timestampsにデフォルトで付与されているためそれに合わせるという理由もありますが、カラム精度を高めるという観点で付与はマストにしたほうが良さそうです。

また、datetime型に関わらず小数点まで保存した方が良いデータについてはprecisionオプションを付与しましょう。

# 実装例

# frozen_string_literal: true

class CreateUser < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name
      t.datetime :posted_at, precision: 6

      t.datetime :created_at, precision: 6, null: false
    end
  end
end

まとめ

  • precisionオプションは小数点第何位まで計測するかどうかを設定するオプション
  • Rails6以降、timestampsにはデフォルトでprecision: 6が付与されるようになった
  • precisionオプションのメリットは、カラム検索の精度を高められること
  • precisionオプションのデメリットは、1レコードあたりのバイト数が増えること
  • datetime型カラム、小数点まで保存した方が良いデータを扱う際はprecisionオプションを設定する

参考

 

 

今回はRails6からtimestampsにデフォルトで追加されるようになったオプション、precisionオプションについてまとめました。Railsがアップグレードされる度に便利な機能が追加されており、今後の新しい機能にも注目です。