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のマイグレーションファイルの真似ですが、ここではname
とpassword
という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
さて、今回はここまでです。