連載
» 2014年05月30日 18時00分 UPDATE

開発現場でちゃんと使えるRails 4入門(5):ActiveRecordの基本機能とマイグレーション、バリデーション (1/3)

エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、Railsのモデル機能を担うActiveRecordの基本的なメソッドに加え、where、order、limitを紹介。DBマイグレーションやバリデーションも。

[著:林慶、監修:山根剛司,株式会社アジャイルウェア]

Rails以外でも使えるO/Rマッパー「ActiveRecord」を使いこなそう

今回の主な内容


「開発現場でちゃんと使えるRails 4入門」のインデックス

連載目次

 今回からRuby on Rails(以下、Rails)を構成している各技術に注目していきます。

 まずは、Railsのモデルの機能を担うActiveRecordを2回にわたって解説していきます。ActiveRecordはデータベース上のテーブルを1つのクラスにマッピングするO/Rマッパーです。サポートする機能は多岐にわたります。

 また、ActiveRecordはRails以外でも、つまり、ActiveRecord単体でRubyのスクリプトとして使えるので身に付けて損のない技術です。

 今回は基本的な機能とマイグレーション、そしてバリデーションについて紹介していきます。

※編集部注

本連載はRuby on Rails 4の入門連載です。Rubyについて学びたい方は連載「若手エンジニア/初心者のためのRuby 2.1入門」をご覧ください。


サンプル活用時の注意

 本記事で掲載しているコードはサンプルプロジェクト「book_library」の「/04/book_library」で検証していただけます。rails consoleコマンドでコンソールを立ち上げて検証してみてください。

 連載第3回の「特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法」までの実装を自分でされている方は、次の変更を加えてください。

 まず、次のコマンドでマイグレーションファイルを生成します。

% rails g migration update_users

 生成されたマイグレーションファイルを下記のように変更します

class UpdateUsers < ActiveRecord::Migration
  def change
    add_column :users, :age, :integer
    add_column :users, :last_score, :integer
    add_column :users, :average, :float
    add_column :users, :zip_code, :string
    add_column :users, :tel, :string
    add_column :users, :contact_type, :string, default: 'phone'
  end
end

 次のコマンドでデータベースに適用します。

% rake db:migrate

基本的なActiveRecordのメソッドまとめ

 連載第2回の「scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する」、連載第3回で使ったActiveRecordのメソッドをおさらいしておきましょう。

 ActiveRecordにより、モデルオブジェクトは属性としてテーブルのカラムをマッピングしています。それらの属性はオブジェクト生成時に初期化したり、パブリックなインスタンス変数として使ったりすることができます。

 ただし、データベースに変更を反映させるには特別なメソッドを呼び出す必要があります。ActiveRecordに備わっているメソッドを使って確認していきましょう。

モデルオブジェクトを生成/保存する「new」「save」「create」メソッド

 モデルクラスの「new」メソッドは「AcitveRecord::Base」サブクラスのインスタンス、すなわちモデルオブジェクトを生成します。newメソッドは属性をキーとするハッシュを引数にとり、その値で属性を初期化できます。newメソッドで生成されたオブジェクトをデータベースに保存するには「save」メソッドを呼びます。

 下記コードでは、「name」「age」というカラムがある「users」テーブルに対し、「User」というモデルが定義されています。「persisted?」はモデルオブジェクトが保存済みか確認するメソッドです。

user = User.new(name: 'アリス', age: 30)
user.persisted?  # => false 保存済みでない
user.save
user.persisted?  # => true  保存済みである

 未保存のオブジェクトに対してsaveメソッドを実行すると、データベースに対してSQLのINSERT文が実行され、オブジェクトの現在の属性値を対応するカラムに保存します。

 また、既に保存されているオブジェクトの場合、saveメソッドは属性値がデータベースの値と異なればSQLのUPDATE文を実行し、データベースを更新します。

 下記コードの「changed?」はDBに存在するモデルオブジェクトに変更があるか確認するメソッドです。

user.name     # => 'アリス'
user.changed? # => false 変更されていない
user.name = 'ボブ'
user.changed? # => true  変更されている
user.save
user.changed? # => false 変更されていない

 そして、「create」メソッドはnewメソッドとsaveメソッドを同時に実行できます。

user = User.create(name: 'キャロル', age: 28)
user.persisted?  # => true  保存済みである

モデルオブジェクトの変更とデータベースの更新を同時に行う「update」メソッド

 updateメソッドはオブジェクトの変更とデータベースの更新を同時に行います。

user.name     # => 'キャロル'
user.changed? # => false 変更されていない
user.update(name: 'デイブ', age: 33)
user.name     # => 'デイブ'
user.changed? # => false 変更されていない

補足:Rails 4より前は「update_attributes」メソッドだった

 バージョン4.0より前のRailsではupdateメソッドは「update_attributes」という名前のメソッドでした。

 バージョン4.0からはupdate_attributesはupdateメソッドのエイリアスとなっています。update_attributesが非推奨になっているわけではないですが、4.0以前の後方互換性を気にする必要がない場合はupdateを使用する方が良いと思います。


モデルオブジェクトをデータベースから削除する「destroy」メソッド

 destroyメソッドはオブジェクトをデータベースから削除します。destroyメソッドが呼び出されると、SQLのDELETE文が実行されます。

 下記コードのdestroyed?は削除済みか確認するメソッドです。

user.destroyed? # => false 削除済みでない
user.destroy
user.destroyed? # => true  削除済みである

テーブル上のレコードの1つをモデルオブジェクトとして取り出す「find」メソッド

 findメソッドはデータベースにあるテーブル上のレコードの1つをモデルのオブジェクトとして取り出します。主キーを引数として渡して取り出されるレコードを指定します。

user = User.find(1)
user # => #<User id: 1, name: "アリス", age: 30, created_at: (略), updated_at: (略)>

 引数に渡した主キーを持つレコードがない場合には「ActiveRecord::RecordNotFound」の例外が発生するため、注意が必要です。

 次ページからは、本連載ではまだ触れていないActiveRecordの機能について解説していきます。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。