LoginSignup
1
0

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す51(MySQL default編)

Posted at

はじめに

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 のカラムを変換した値にします。
atonlimit: 5 を指定しているのは、 255.255.255 を数値に変換した時に正しい値が保存されるようにするためです。

db/migrate/20190706063437_create_hosts.rb
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 にします。

app/controllers/hosts_controller.rb
class HostsController < ApplicationController
  ...
  def index
    @hosts = Host.all.order(:aton)
  end
  ...
end

seed データを作る

1件ずつブラウザでデータを登録するのは面倒なので、seed データを作っておきます。

db/seeds.rb
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アドレスの順番にソートされています。
host_order_by_aton.png

ちなみに order:ip を指定すると文字列としてソートされてしまいます。
host_order_by_ip.png

その他

ツッコミどころの多いソースかも知れませんが、今回は、あくまで default で式が使えることを確認する目的ですので見逃してください。
あと、今回は試してませんが、インデックスでも式を使うことができるようになっています。

試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try051_mysql_default_expression

参考情報

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0