はじめに
Rails 6 に追加されそうな新機能を試す第51段。 今回は、 MySQL default
編です。
Rails 6 では、 MySQL 8.0.13 以降のデータベースの場合に マイグレーションのカラムを追加するときに default オプションで式を指定できるようになりました。
言い換えると、MySQL 8.0.13 以降で カラムの default に式が使えるようになったことに、Rails が対応したということになります。
Ruby 2.6.3, Rails 6.0.0.rc1, MySQL 8.0.16 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
今回は、IPアドレスをソートして表示する機能を作ってみたいと思います。
rails プロジェクトを作る
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
scaffold で CRUD の機能を作る
scaffold で Host の CRUD を作成します。
カラム aton
は、IPアドレスを数値に変換した値を保存します。
$ bin/rails g scaffold Host ip aton:integer
migration ファイルを編集する
migration ファイルを編集します。
ip
カラムに null: false
を指定します。
aton
のデフォルト値は、MySQL の関数 INET_ATON()
を使って ip
のカラムを変換した値にします。
aton
に limit: 5
を指定しているのは、 255.255.255
を数値に変換した時に正しい値が保存されるようにするためです。
class CreateHosts < ActiveRecord::Migration[6.0]
def change
create_table :hosts do |t|
t.string :ip, null: false
t.integer :aton, limit: 5, default: -> { '(inet_aton(ip))' }
t.timestamps
end
end
end
HostController#index
を変更する
IPアドレスをソートして表示するために、 order
を追加します。
ソートのキーは aton
にします。
class HostsController < ApplicationController
...
def index
@hosts = Host.all.order(:aton)
end
...
end
seed データを作る
1件ずつブラウザでデータを登録するのは面倒なので、seed データを作っておきます。
Host.create(
[
{ ip: '192.168.1.1' },
{ ip: '192.168.2.1' },
{ ip: '192.168.9.1' },
{ ip: '192.168.10.1' },
{ ip: '192.168.20.1' },
{ ip: '192.168.99.1' },
{ ip: '192.168.120.1' }
]
)
データベースを作る
データベースを作って seed データを登録します。
$ bin/rails db:create db:migrate db:seed
rails server を実行して Host の一覧を表示する
rails server を実行します。
$ bin/rails s
http://localhost:3000/hosts で一覧画面を表示します。
IPアドレスの順番にソートされています。
ちなみに order
で :ip
を指定すると文字列としてソートされてしまいます。
その他
ツッコミどころの多いソースかも知れませんが、今回は、あくまで default で式が使えることを確認する目的ですので見逃してください。
あと、今回は試してませんが、インデックスでも式を使うことができるようになっています。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try051_mysql_default_expression