Sukoshi. Fuzoroi

某フリーPGの技術っぽいブログ。

既存のDBをActiveRecordを使ったrubyスクリプトで操作する

すごく久しぶりに書く技術ブログ…前回は去年の8月かぁ(遠い目…

今回は既存のDBの中味を ActiveRecord gem で操作するときの手順などを書いてみたいと思います。ActiveRecord のバージョンは 4.1.8 です。

環境構築

DB接続情報

まずは接続情報をYAMLで用意しておきましょう。別にスクリプト中に直接書いてもかまいませんが、YAMLで別ファイルにしておくと複数接続先を切り替えたいときに便利です。

database.yml
db:
  local:
    adapter:  mysql2
    host:     localhost
    username: sample_user
    password: samplesample
    database: sample_db

スクリプト

実際のスクリプトは下記のようになります。

test.rb
require 'active_record'
require 'yaml'

#DB接続情報を読み込み
conf = YAML.load_file('./database.yml')

#接続情報を渡しDBへ接続する
ActiveRecord::Base.establish_connection(conf['db']['local'])

# ユーザモデルを定義
class User < ActiveRecord::Base

  # 使用するテーブル名を指定
  # テーブル名がActiveRecordの命名規約に沿っていない場合のみ
  self.table_name = 'user'

end

# 全ユーザを出力
p User.all

既存カラム名ActiveRecord予約語とバッティングした場合の対処

スクリプトも書けて、さぁバリバリ操作しようと意気揚々と実行させたら…下記のようなエラーメッセージが…

`instance_method_already_implemented?': hash is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name. (ActiveRecord::DangerousAttributeError)

既存DBのカラム名の中にActiveRecord予約語とバッティングするものがあったため例外が発生しています。(この場合は hash というカラム名が問題ですね)

このような場合はカラム名を変更するのがベストなんですが、既存DBのためそれも困難…

しかしこれに対処するための safe_attributes というgemが存在します。

そのgemを使用したサンプルコート

require 'active_record'
require 'safe_attributes/base'
require 'yaml'

#DB接続情報を読み込み
conf = YAML.load_file('./database.yml')

#接続情報を渡しDBへ接続する
ActiveRecord::Base.establish_connection(conf['db']['local'])

# ユーザモデルを定義
class User < ActiveRecord::Base

  # SafeAttributesをinclude
  include SafeAttributes::Base

  # 予約語と重複しているカラム名を指定
  bad_attribute_names :hash
  
  # 使用するテーブル名を指定
  # テーブル名がActiveRecordの命名規約に沿っていない場合のみ
  self.table_name = 'user'

end

# 全ユーザを出力
p User.all

これでバッチリ回避できました!