RailsでデータをDBに投入するActive Record [初心者向けチュートリアル]

プログラム初心者な方向けに始めたRailsチュートリアルシリーズです。今回はRailsのWebアプリケーションでDBを扱う場合に便利なライブラリ『Active Record』の入門記事です。

たとえば、拙著の『Nokogiri を使った Rubyスクレイピング』で取得したデータをWebサイトで表示する場合は、スクレイピングした時点でDBに入れておくのが一般的です。そうすることで、スクレイピングする処理と、表示にかかわる処理をシンプルにできます。


🤔 目次

(1) 前提として

(2) ActiveRecordとは?

(3) ActiveRecordについて最初に読んでおくと良い資料

(4) シンプルなActiveRecordの操作について

(5) 実際にコードを書いていくのに参考になりそうなサイト

👽 (1) 前提として

この記事は、Railsのアプリケーションをベースに話を進めていきます。そのため、もし『Rails x Herokuでアプリを作成』をまだ読んでおられない場合は、もし先に読んでからこの記事に戻ってきてもらえると泣いて喜んで歌って踊ります!

🍣 (2) Active Recordとは?

Active Recordとは、データベース(DB)の種類を意識することなく、プログラミングしやすい形でDBのテーブルとのデータのやりとりを行えるようにするためのライブラリです。

オープンソースのリレーショナル・データベースだけでもMySQL、PostgreSQL、SQLite、SQL Server,
Sybase, Oracleなどなどさまざまな種類があります。各言語に合わせてプログラミングを書き直していると、膨大な手間がかかってしまう可能性があります。そういったことを最小限にしてくれるのがActive Recordのような『[O/Rマッパ]』と呼ばれるしくみです。

🐠 (3) Active Recordについて最初に読んでおくとよい資料

http://dotinstall.com/lessons/basic_activerecord

まずは、初学者の親友ドットインストールさんの『ActiveRecord入門 (全14回)』が最初に見ておくと捗ります。

http://www.techscore.com/tech/Ruby/Rails/model/activerecord/1/

また、TECHSCOREさんの『ActiveRecordシリーズ』も作成・読み込み・更新・削除(CRUD)の一連の流れを丁寧に解説してくれています!

🚌 (4) シンプルなActive Recordの操作について

モデルの作成

ここからは実際にRailsでモデル(Active Record)を作っていきながら、簡単なデータの追加と削除をやってみます。

まずは、Active RecordのモデルUserを作成するためにターミナルで次のコマンドを実行します。

rails g model user name:string email:string

ちなみに、rails generate(g)はrailsのモデルや、ビュー、コントローラ、scaffold(土台)を作ることもできます。

このコマンドが完了すると次の2つのファイルができます。

db/migrate/xxxx_users.rb #=> UserモデルをDBのテーブルとして作成するためのファイル
app/model/user.rb #=> Userモデル(ActiveRecord)を表す。モデルに関わる処理を書く

マイグレーションファイル

先ほど自動で作成されたマイグレーションファイルは次のようになっていると思います。

class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end

このファイルを直接編集することも可能です。

まずこのファイル内では抽象化されたカラムを指定します。カラムの型としては次のようなものがあります。

:string #=> 文字列
:text #=> string読みも長い文字列
:integer #=> 整数
:float #=> 少数点を含む数
:decimal #=> floatよみも精度の高い少数点を含む数
:datetime #=> 日時
:timestamp #=> より細かい日時
:time #=> 日付
:date #=> 日付
:binary   #=> バイナリデータ
:boolean #=> Boolean型(true or false)

詳細は『テーブルの作成 マイグレーション(migration))』がお勧めです。

さらに、DBにテーブルを作成するために次のコマンドを実行します。もし、Rake db:createを一度も実行していない場合は、先に実行してください。

rake db:migrate

レコードのd作成(Create)・読み込み(Read)・更新(Update)・削除(Delete)

ここからはできるだけ説明を簡単にするためにrails console内で確認をしていきます。次のコマンドを実行するとrailsのコンソールが起動します。

rails console

コンソールが起動したら、次のコマンドを実行してみてください。

# John Dueというユーザーを新規作成
user = User.new({name: 'John Due', email: 'john.due@example.com'})
user.save
# 登録したJohn Dueの読み込み
john = User.find(user.id)
=> #<User:0x007fe6c5436b98> {
:created_at => Sun, 16 Feb 2014 11:39:34 JST +09:00,
:email => "john.due@example.com",
:id => 1,
:name => "John Due",
:updated_at => Sun, 16 Feb 2014 11:39:34 JST +09:00
}
# johnのデータを更新
jhon.name = "John Due2"
jhon.email = "jhon.due2@example.com"
user.save
# 登録したJohn Dueの読み込み、データが更新されています。
john2 = User.find(user.id)
=> #<User:0x007fe6c5436b98> {
:created_at => Sun, 16 Feb 2014 11:39:34 JST +09:00,
:email => "john.due2@example.com",
:id => 1,
:name => "John Due2",
:updated_at => Sun, 16 Feb 2014 11:39:34 JST +09:00
}
# Johnの削除
john2.destroy
# もうJohnは削除済なので存在しません
john = User.find(user.id)
#=> ActiveRecord::RecordNotFound: Couldn't find User with id=1

これでデータベースからデータを作成(Create)・読み込み(Read)・更新(Update)・削除(Delete)することができました。この一連の操作を頭文字をとってCRUDと呼びます。

Railsの処理への反映

これらの処理は実際にはモデルやコントローラなどに個別に記述していくことでWebアプリケーションを作成します。ここでは、CRUDの流れをわかりやすく丁寧に解説しているSpice Lifeの五十嵐さんが一橋大学での講義に使われたスライドを元にトライしてみてください。

Ruby on Rails講義第20回: CRUD基礎

Ruby on Rails講義第21回: New, Create

Ruby on Rails講義第22回: Model

Ruby on Rails講義第24回: new&create

Ruby on Rails講義第25回: model

(5) 実際にコードを書いていくのに参考になりそうなサイト

http://railsdoc.com/

超有名なRailsの日本語リファレンス・サイト。2014/02/16時点でのRailsの最新版(4.0.2)にも対応しており、毎日確実にお世話になっています!

http://magazine.rubyist.net/?0006-RubyOnRails

日本のRubyistで知らない人はいないほど有名なるびまの記事『Rubyist Magazine - RubyOnRails を使ってみる 【第 3 回】 ActiveRecord』は、Active Recordの機能についてしっかりと説明をしていただけています。Active Recordを基礎からしっかり理解するためにぜひ読んでほしい記事!

お願い

個人的に初心者向けにRuby/Railsを教える機会が増えています。この記事に関連する分野で効率的に勉強するのにお勧めな資料をご存じなら、Twitterで@zyunnosukeにメッセージorコメントいただけたら感激します!

逆にこの記事を使ってトライしたら、なんかうまく動かない的な話も同じく大歓迎です。いつでもメッセージください!

📚 おすすめの書籍

💩 欲しいものリスト公開しました