エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、Railsのモデル機能を担うActiveRecordの基本的なメソッドに加え、where、order、limitを紹介。DBマイグレーションやバリデーションも。
今回からRuby on Rails(以下、Rails)を構成している各技術に注目していきます。
まずは、Railsのモデルの機能を担うActiveRecordを2回にわたって解説していきます。ActiveRecordはデータベース上のテーブルを1つのクラスにマッピングするO/Rマッパーです。サポートする機能は多岐にわたります。
また、ActiveRecordはRails以外でも、つまり、ActiveRecord単体でRubyのスクリプトとして使えるので身に付けて損のない技術です。
今回は基本的な機能とマイグレーション、そしてバリデーションについて紹介していきます。
本記事で掲載しているコードはサンプルプロジェクト「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
連載第2回の「scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する」、連載第3回で使ったActiveRecordのメソッドをおさらいしておきましょう。
ActiveRecordにより、モデルオブジェクトは属性としてテーブルのカラムをマッピングしています。それらの属性はオブジェクト生成時に初期化したり、パブリックなインスタンス変数として使ったりすることができます。
ただし、データベースに変更を反映させるには特別なメソッドを呼び出す必要があります。ActiveRecordに備わっているメソッドを使って確認していきましょう。
モデルクラスの「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メソッドはオブジェクトの変更とデータベースの更新を同時に行います。
user.name # => 'キャロル' user.changed? # => false 変更されていない user.update(name: 'デイブ', age: 33) user.name # => 'デイブ' user.changed? # => false 変更されていない
バージョン4.0より前のRailsではupdateメソッドは「update_attributes」という名前のメソッドでした。
バージョン4.0からはupdate_attributesはupdateメソッドのエイリアスとなっています。update_attributesが非推奨になっているわけではないですが、4.0以前の後方互換性を気にする必要がない場合はupdateを使用する方が良いと思います。
destroyメソッドはオブジェクトをデータベースから削除します。destroyメソッドが呼び出されると、SQLのDELETE文が実行されます。
下記コードのdestroyed?は削除済みか確認するメソッドです。
user.destroyed? # => false 削除済みでない user.destroy user.destroyed? # => true 削除済みである
findメソッドはデータベースにあるテーブル上のレコードの1つをモデルのオブジェクトとして取り出します。主キーを引数として渡して取り出されるレコードを指定します。
user = User.find(1) user # => #<User id: 1, name: "アリス", age: 30, created_at: (略), updated_at: (略)>
引数に渡した主キーを持つレコードがない場合には「ActiveRecord::RecordNotFound」の例外が発生するため、注意が必要です。
次ページからは、本連載ではまだ触れていないActiveRecordの機能について解説していきます。
Copyright © ITmedia, Inc. All Rights Reserved.