techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Active Recordを利用してRubyのアプリを作る

Active Recordは、Ruby on Railsでも利用されているORマッパーのgemパッケージですが、RailsではないRubyアプリで単体利用することもできます。

今回たまたまRubyで利用したい思う機会があったので調べて試してみましたので備忘録です。

準備

環境は以下の通りです。
・Mac OS X 10.11.5
・Ruby 2.3.1
・Active Record 5.0.0
・MySQL 14.14

Rubyはあらかじめrbenv等でインストールしておきます。
Active Recordはgemパッケージなので、以下のコマンドでインストールできます。

# gem install activerecord

Ruby 2.1.2だとバージョンが合わずエラーになりました。2.2.2以上を利用します。

MySQLは以下でインストールです。

# brew instal mysql

特に問題なく入りました。
MySQLが入ったところで、先にデータベースを作成しておきます。

# mysql -uroot
mysql> CREATE DATABASE ac_test;

今回はac_testというデータベースを作成しておきました。
また、MySQLをRubyから利用するためのgemパッケージmysql2もインストールしてきます。

# gem install mysql2

マイグレーションする

準備が整ったので、Active Recordを用いてテーブルを一つ作ってみます。
この先、activerecordというフォルダを作成し、その中で作業を行っていきます。
今回は以下のようなRubyスクリプトを作成します。
[create_users.rb]

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :password
    end
  end

  def self.down
    drop_table :users
  end
end

Ruby on Railsのマイグレーションファイルの真似ですが、ここではnamepasswordという2つの文字列型カラムを持つusersテーブルを一つ作っています。

さて、次にデータベースに接続するための情報を保持するdatabase.ymlファイルを作成します。
[database.yml]

db:
  development:
    adapter: mysql2
    encoding: utf8
    reconnect: false
    database: ac_test
    pool: 5
    username: root
    password:
    host: localhost
    timeout: 5000

  production:
    adapter: mysql2
    encoding: utf8
    reconnect: false
    database: ac_test
    pool: 5
    username: root
    password:
    host: localhost
    timeout: 5000

あとはデータベースに接続して、作成したCreateUsersクラスのupメソッドを実行し、ac_testデータベースにusersテーブルを作成するためのスクリプトを作成します。
[migrate.rb]

# -*- encoding: utf-8 -*-
require "rubygems"
require "active_record"
require 'yaml'
require 'erb'
require_relative 'create_users'

# database.ymlを読み込む
config = YAML.load_file( './database.yml' )
# development環境に接続
ActiveRecord::Base.establish_connection(config['db']['development'])

CreateUsers.up

rubyコマンドを実行しましょう。

ruby migrate.rb

これでac_testデータベースにusersテーブルができているはずです。

# mysql -uroot ac_test
mysql> show tables;
+-------------------+
| Tables_in_ac_test |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

今回は動作確認用に適当なユーザをInsertしておきました。

mysql> select * from users;
+----+------+----------+
| id | name | password |
+----+------+----------+
|  1 | seit | ties     |
+----+------+----------+
1 row in set (0.01 sec)

Ruby on Rails同様Rakeを用いることもできそうなので、また別の機会に試してみます。

usersテーブルにマッピングされたクラスを作成する

usersテーブルができたので、マッピングします。
この辺りもRailsのモデルを参考に。
[user.rb]

require "rubygems"
require "active_record"
require 'yaml'

# database.ymlを読み込む
config = YAML.load_file( './database.yml' )
# development環境に接続
ActiveRecord::Base.establish_connection(config['db']['development'])

class User < ActiveRecord::Base
end

ActiveRecord::Baseクラスを継承したUserクラスを用意します。ポイントはクラスの名称をテーブルの名称に合わせることです。Ruby on Railsでもそうでしたが、テーブル名は複数形(users)、クラス名は先頭大文字の単数系(User)です。
データベースに接続する記述は下記のac_test.rbで記述しても良いのですが、Userクラスを利用するたびに記述するのは面倒なのでひとまずUserクラスに書いています。
さて、あとはUserクラスを利用してデータベースにアクセスします。 [ac_test.rb]

require "rubygems"
require "active_record"
require_relative "user"

class DbTest
  def login
    result = User.find_by_name!( 'seit' )
    puts "name : " << result.name << ", " << "password : " << result.password
  end
end

test = DbTest.new
test.login

実行して結果を確認します。

# ruby ac_test.rb
name : seit, password : ties

さて、今回はここまでです。