第3回 Scaffoldで簡単にデータアクセス
第3回 Scaffoldで簡単にデータアクセス
連載第3回は、データアクセスに焦点をあわせて進めたいと思います。Railsには、Scaffold機能があります。今回は、このScaffold機能を使ってアプリケーション全体の雛形を作成し、これら作成されたソースコードを利用してデータアクセス処理に触れたいと思います。
Scaffoldってなんだろう?
Scaffold は、Railsアプリケーションで使用するいくつかの主要な部品を、迅速に生成する方法です。一回の操作で、Model/View/Controllerを生成することができます。また、Scaffoldとあわせてマイグレーション機能を使えば、指定したデータベース上に、Scaffoldで生成したModelに対応するテーブルが生成されます。
Scaffold機能を使ってみよう!
では早速、Scaffoldを使ってみましょう。ここでは、ユーザー情報を管理するテーブルを題材にします。テーブル名は「users」とします。作成する項目は以下の通りです。
- id : PrimaryKey項目
- user_id : ユーザーID
- password : パスワード
- user_name : ユーザー名
- mail_address : メールアドレス
作業用のプロジェクトですが、第1回を参考に新しく作成しましょう。名前は「lesson03」にします(筆者は第一回と同じく、「rails_article_work」という作業ディレクトリ内にlesson03を作成した)。プロジェクトの作成が完了したら、lesson03ディレクトリに移動し、下記の「rails generate」コマンドを実行してください。
$ cd lesson03 $ rails generate scaffold user id:integer user_id:string password:string user_name:string mail_address:string invoke active_record create db/migrate/20110925051753_create_users.rb create app/models/user.rb invoke test_unit create test/unit/user_test.rb create test/fixtures/users.yml route resources :users ・ ・ ・ |
これで、Model/View/Controllerが作成されました。これだけでも、非常に便利に感じるのですが、マイグレーション機能を利用することで、データベースにテーブルを作成することができます。下記のコマンドを実行してみてください。
$ rake db:migrate == CreateUsers: migrating ==================================================== -- create_table(:users) -> 0.0017s == CreateUsers: migrated (0.0018s) =========================================== |
サーバーを起動して、http://127.0.0.1:3000/usersを表示してみましょう。
$ rails server |
下図の通りに、ユーザー一覧画面が表示されると思います。New Userリンクをクリックすれば、新規ユーザー登録画面を表示させることができます。
図 1ユーザー一覧画面
新規ユーザー登録画面で下図のように各項目に値を入力して、Create Userボタンをクリックすれば、新規ユーザー登録結果画面に遷移し、新規ユーザー登録が完了します。
図 2 新規ユーザー登録画面
図 3 新規ユーザー登録結果画面
上記の通りにユーザー登録を進めたあとに、再度、一覧画面を表示してみるとユーザーが正常に登録されたことがわかると思います。
図 4 登録後のユーザー一覧画面
いかがでしたか?データベースにSQLite3を使っていることもありますが、とても簡単にデータアクセス機能を作成することができました。使用するデータベースの変更や、テーブルの各項目の属性を細かく設定することも可能です。
使用するデータベースを変更する
アプリケーションによって、使用するデータベースを変えたい時もあると思います。マイグレーションの説明になってしまいますが、マイグレーション機能ではデータベースを変えてテーブル作成を行えます。データベースの設定は、「config/database.yml」にて行います。
config/database.ymlを開いてみると、デフォルトでは下記のように記述されています。
# SQLite version 3.x # gem install sqlite3 development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 timeout: 5000 production: adapter: sqlite3 database: db/production.sqlite3 pool: 5 timeout: 5000 |
例えば、データベースにPostgreSQLを使いたい場合は、config/database.ymlを、以下の通りに編集します(赤字部分)。なお、データベース名は「lesson03」、ユーザー名とパスワードも「lesson03」と仮定し、PostgreSQL上に作成されている必要があります。
# SQLite version 3.x # gem install sqlite3 development: adapter: postgresql database: lesson03 username: lesson03 password: lesson03 host: localhost pool: 5 timeout: 5000 encoding: utf8 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: adapter: postgresql database: lesson03 username: lesson03 password: lesson03 host: localhost pool: 5 timeout: 5000 encoding: utf8 production: adapter: postgresql database: lesson03 username: lesson03 password: lesson03 host: localhost pool: 5 timeout: 5000 encoding: utf8 |
この設定を行ったあとに、下記のコマンドを実行して、PostgreSQLへ接続するために必要なライブラリをインストールします。
$ gem install pg |
Gemfileを開いて、以下の通りに編集します(赤字部分)
source 'http://rubygems.org' gem 'rails', '3.0.9' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' #gem 'sqlite3' gem 'pg', :require => 'pg' # Use unicorn as the web server # gem 'unicorn' (省略) |
最後に、「rake db:migrate」を実行すれば、PostgreSQL上のデータベース「lesson03」に、テーブルが作成されます。
項目の属性を変更する
例えば、user_nameの項目長を100、nullを不可にしたいとします。その場合、まずは「rails generate migration」コマンドを使って、項目修正用の新たなマイグレーションファイルを作成します。以下のコマンドを実行してください。
$ rails generate migration ChangeUserName invoke active_record create db/migrate/YYYYMMDDHHMMSS_change_user_name.rb |
「db/migrate」ディレクトリを見てみると、「YYYYMMDDHHMMSS_change_user_name.rb(例:20111001121200_ change_user_name.rb)」というファイルが生成されています。これを開いてみましょう。
class ChangeUserName < ActiveRecord::Migration def self.up end def self.down end end |
まだ何も処理内容が記述されていない空ファイルが作成されたと思います。この作成されたマイグレーションファイルに対して、以下のように編集します(赤字部分)。
class ChangeUserName < ActiveRecord::Migration def self.up change_column :users, :user_name, :string, :limit=>100, :null => false end def self.down # rake db:rollbackでデータを破壊する可能性があるので、下記の記述により自動でrollbackさせない raise ActiveRecord::IrreversibleMigration end end |
この設定を行ったあとに、「rake db:migrate」を実行すれば、user_nameの項目長は100で、nullは不可という設定になります。
他に、項目の追加や削除を行うことも可能です。例えば、usersテーブルに性別(gender)という項目を追加したい場合は、以下のコマンドを実行して、マイグレーションファイルを作成します。
$ rails generate migration AddGenderToUsers gender:integer invoke active_record create db/migrate/YYYYMMDDHHMMSS_add_gender_to_users.rb |
「db/migrate」ディレクトリを見てみると、「YYYYMMDDHHMMSS_add_gender_to_users.rb(例:20111001121200_add_gender_to_users.rb)」というファイルが生成されています。これを開いてみましょう。
class AddGenderToUsers < ActiveRecord::Migration def self.up add_column :users, :gender, :integer end def self.down remove_column :users, :gender end end |
あとは、「rake db:migrate」を実行すれば、usersテーブルにgenderという項目が追加されます。
おわりに
連載第3回目はいかがだったでしょうか。Scaffoldを使うと、アプリケーション全体の作成および、データベースアクセス機能の作成がとても簡単にできることが、お分かりいただけたかと思います。なお、DBのマイグレーション機能(rake db:migrateなど)は、他にもロールバックしたり、やり直したりすることが可能です。これらについては、本連載では詳しく触れませんので、下記の公式ドキュメント(英文)をご参照ください。
さて次回は、今回作成したユーザー登録画面に入力チェック機能をつけたり、これとは別に、簡単な商品購入ページを作ったりしたいと思います。お楽しみに!
第3回 おしまい
※.記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。