
こんにちは、トランスネットの泉です。
2014年12月19日、Ruby on Rails 4.2.0がリリースされました。
皆さんはもう試されましたでしょうか。
公式BlogやRelease 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を利用して開発用サーバにアクセスすることがあります。
いつもの通りVMゲスト上のIE11からVMホスト上でrails sしたサーバにアクセスしようとしたところ、失敗してしまいました…
Default Host …
この件については、Release notesの3.3 Default Host for rails serverに事情が記されています。
こちらによりますと、セキュリティ上の理由でデフォルトではlocalhostからしかアクセスできなくなりました。
-bオプションを指定することで、従来通りの挙動に戻すことができます。
なお、firewallで開発サーバへのアクセスを制限するように、と併せて記されていますのでご注意ください。
$ bundle exec rails server -b 0.0.0.0
無事、 VMゲスト上からVMゲスト上の開発サーバにアクセスできるようになりました。
Foreign key Support
無事アプリケーションにアクセスできるようになったところで、新機能Foreign key Supportを見ていきたいと思います。
なお、この機能を利用するためには外部キー制約に対応したDBMSを利用する必要があります。
今回はMySQL 5.6を利用しています。
外部キー制約
業務アプリケーションを開発する上では、DBテーブルに外部キー制約を持たせる必要が生じることがあります。
しかし、従来のRailsではそのまま対応することができませんでした。
今回のリリースにより、遂にmigrationファイルで外部キー制約を扱えるようになりました。
add_foreign_key
従来通りの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 |
いつも通り、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を削除してみます。
RDBMSによりエラーとなりました(Mysql2::Error)。
userに関連するdeviceを削除すると、userも削除出来るようになるはずです。
まず、deviceを削除し
今回は削除することができました。
Modelの機能ではなく、外部キー制約により削除が制限されている挙動を確認することができました。
まとめ
新しくリリースされたRails 4.2.0の新機能の中から、Foreign key Support-外部キー対応 についてご紹介しました。
「Rails 外部キー制約」などと検索すると、レールに乗ったままこの問題(?)に対応するために様々な方法が試されてきた歴史を垣間見ることができます。
Active JobやAdequate Recordが話題となっている今回のリリースですが、個人的には公式BlogのForeign key Supportの紹介、「drama daysは終わった」という一文が印象的でした:-)
Railsは既に5へ向けての開発をスタートしています。
弊社でもよりよい開発のために、乗り遅れないように取り組んで参ります。
それでは今日はこの辺で。次回をお楽しみに♪