更新情報

こんにちは、トランスネットの泉です。

2014年12月19日、Ruby on Rails 4.2.0がリリースされました。
皆さんはもう試されましたでしょうか。

公式BlogRelease Notesにありますように、幾つかの気になるアップデートが取り込まれています。

  • Active Job
  • Asynchronous mails
  • Adequate Record
  • Web Console
  • Foreign key support

enjoy Railsway第4回は、この新しい RoRリリースについて気になった点、そして「Foreign key support」をご紹介します。

rails new

新しくRailsアプリケーションを作る手順に変更はなく、従来通りrails newコマンドを実行します。

rails server

従来通りデータベースを設定、マイグレーションを実行し、従来通りrails serverコマンドで開発用のサーバを起動できます。

…繋がらない!?

複数のブラウザ環境で動作を確認するため、あるいは開発環境を隔離するため、などの目的でVMを利用して開発用サーバにアクセスすることがあります。
001

いつもの通りVMゲスト上のIE11からVMホスト上でrails sしたサーバにアクセスしようとしたところ、失敗してしまいました…

Default Host  …

この件については、Release notes3.3 Default Host for rails serverに事情が記されています。

こちらによりますと、セキュリティ上の理由でデフォルトではlocalhostからしかアクセスできなくなりました。
-bオプションを指定することで、従来通りの挙動に戻すことができます。
なお、firewallで開発サーバへのアクセスを制限するように、と併せて記されていますのでご注意ください。

$ bundle exec rails server -b 0.0.0.0

再びアクセスしてみます。
002

無事、 VMゲスト上からVMゲスト上の開発サーバにアクセスできるようになりました。

Foreign key Support

無事アプリケーションにアクセスできるようになったところで、新機能Foreign key Supportを見ていきたいと思います。

なお、この機能を利用するためには外部キー制約に対応したDBMSを利用する必要があります。
今回はMySQL 5.6を利用しています。

外部キー制約

業務アプリケーションを開発する上では、DBテーブルに外部キー制約を持たせる必要が生じることがあります。
しかし、従来のRailsではそのまま対応することができませんでした。
今回のリリースにより、遂にmigrationファイルで外部キー制約を扱えるようになりました。

add_foreign_key

次のような関係のModelを用意することとします。
003

従来通りのmigrationファイルに、以下のようにadd_foreign_keyを記述します。

class CreateDevices < ActiveRecord::Migration
def change
create_table :devices do |t|
t.references :user
t.string :name
t.timestamps null: false
end
add_foreign_key :devices, :users
end
end
view rawcreate_devices.rb hosted with ❤ by GitHub

いつも通り、migrationを実行します。

$ bundle exec rake db:migrate

== 20150113224732 CreateUsers: migrating ======================================
— create_table(:users) -> 0.0664s
== 20150113224732 CreateUsers: migrated (0.0664s) =============================

== 20150113230425 CreateDevices: migrating ====================================
— create_table(:devices) -> 0.0293s
— add_foreign_key(:devices, :users) -> 0.0618s
== 20150113230425 CreateDevices: migrated (0.0912s) ===========================

 

“a foreign key constraint fails”

外部キー制約が正しく機能することを確認してみます。

userに対し、deviceを追加します。
004

userを削除してみます。
con2005
RDBMSによりエラーとなりました(Mysql2::Error)。

userに関連するdeviceを削除すると、userも削除出来るようになるはずです。
まず、deviceを削除し
006

もう一度userを削除してみます。
007

今回は削除することができました。

Modelの機能ではなく、外部キー制約により削除が制限されている挙動を確認することができました。

まとめ

新しくリリースされたRails 4.2.0の新機能の中から、Foreign key Support-外部キー対応 についてご紹介しました。
「Rails 外部キー制約」などと検索すると、レールに乗ったままこの問題(?)に対応するために様々な方法が試されてきた歴史を垣間見ることができます。
Active JobやAdequate Recordが話題となっている今回のリリースですが、個人的には公式BlogのForeign key Supportの紹介、「drama daysは終わった」という一文が印象的でした:-)

Railsは既に5へ向けての開発をスタートしています。
弊社でもよりよい開発のために、乗り遅れないように取り組んで参ります。

それでは今日はこの辺で。次回をお楽しみに♪