ActiveRecord を素で使うテンプレ

次のようにすることで,Active Record を素で使うことが出来ます.Ruby on Rails が裏側でやってくれていることを自分でやるだけです.

# Active Record を gem でインストールしたなら rubygems を require する
require 'rubygems'
require 'active_record'

# 最後のほうで pp を使うから require しておく
require 'pp'

# 文字エンコーディングは UTF-8
$KCODE = 'u'

# ActiveRecord の初期化 / データベース接続
ActiveRecord::Base.establish_connection(
  :adapter  => 'mysql',
  :username => 'muraken',
  :password => File.read('password'),
  :socket   => '/var/run/mysqld/mysqld.sock',
  :database => 'asel_web_crawling_20071010',
  :encoding => 'UTF8'
)

# ログ採取の設定
require 'logger'
ActiveRecord::Base.logger = Logger.new('active_record_ex.log')

class User < ActiveRecord::Base
  belongs_to :group
  has_many :group_affiliation
end

class Group < ActiveRecord::Base
  has_many :users
  has_many :group_affiliation

  def has_member?(username)
    if !User.find(:all, :conditions => ['name = ?', username]).
        select{|u| u.group == self }.empty?
      return true
    end
    if !GroupAffiliation.find(:all, :conditions => ['group_id = ?', self.id]).
        select {|ga| ga.user.name == username }.empty?
      return true
    end
    false
  end
end

class GroupAffiliation < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

# テーブルが無かったら作る
class CreateUserAndGroupTable < ActiveRecord::Migration
  unless User.table_exists? then
    create_table :users do |t|
      t.column :name, :text
      t.column :group_id, :integer
    end
  end

  unless Group.table_exists? then
    create_table :groups do |t|
      t.column :name, :text
    end
  end

  unless GroupAffiliation.table_exists? then
    create_table :group_affiliations do |t|
      t.column :user_id, :integer
      t.column :group_id, :integer
    end
  end
end

# グループ「ASEL」
unless asel = Group.find(:first,
                         :conditions => [ 'name = ?', 'ASEL']) then
  asel = Group.new()
  asel.name = 'ASEL'
  asel.save
end
pp asel

# ユーザ「むらけん」
unless muraken = User.find(:first,
                           :conditions => [ 'name = ?', 'むらけん']) then
  muraken = User.new()
  muraken.name = 'むらけん'
  muraken.group = asel
  muraken.save
end
pp muraken

# ユーザ「めぐぅ」
unless meguu = User.find(:first,
                           :conditions => [ 'name = ?', 'めぐぅ']) then
  meguu = User.new()
  meguu.name = 'めぐぅ'
  meguu.group = asel
  meguu.save
end
pp meguu

# グループ「管理者」
unless admin = Group.find(:first,
                          :conditions => [ 'name = ?', '管理者']) then
  admin = Group.new()
  admin.name = '管理者'
  admin.save
end
pp admin

pp admin.has_member?('むらけん')

# むらけんは管理者でもある
unless admin.has_member?('むらけん') then
  ga = GroupAffiliation.new
  ga.user = muraken
  ga.group = admin
  ga.save
end

pp admin.has_member?('むらけん')

pp User.find(:all)