アプリケーションのDBセットアップをするためのRaketaskファイル(setup.rake)

アプリケーションをセットアップするのをRakeでやりたい

やることは以下の3つ

2,3番目はmigrationを使います

  • create_user.rb
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :family_name,     :string, :limit => 40, :null => false
      t.column :first_name,      :string, :limit => 40, :null => false
      t.column :login_name,      :string, :limit => 40, :null => false
      t.column :hashed_password, :string, :limit => 40, :null => false
    end
  end

  def self.down
    drop_table :users
  end
end
  • setup.rb
class Setup < ActiveRecord::Migration
  def self.up
    User.setup
  end

  def
    User.delete_all
  end
end
  • user.rb
class User <  ActiveRecord::Base
  def self.setup
    create(:family_name    => "田中",
           :first_name     => "太郎",
           :login_name     => "tanaka",
           :hased_password => plain_password_to_hash('tanaka'))
  end

  private
  
  def plain_password_to_hash(plain_password)
    #ハッシュ値に変換
  end
end

Raketaskファイル作成

このtaskでは、DBテーブルを作成し、migrationを適応させるという2つのことを行います。

  • setup.rake
require 'environment'

databases                = %w(myapp_development myapp_test)
user                     = "myuser"
user_password            = "mypassword"
mysql_root_user_password = [MySQLのrootユーザーのpassword]

#Mysqlにrootユーザーで接続
def connect
  ActiveRecord::Base.establish_connection(
                                          :adapter => 'mysql',
                                          :host => 'localhost',
                                          :username => 'root',
                                          :password => mysql_root_user_password,
                                          :database => 'mysql'
                                          )
end

#セットアップタスク
#db:setup、db:migrate2つのタスクを実行
task :setup do
  %w(db:setup db:migrate).each do |task|
    Rake::Task[task].invoke
  end
end

namespace :db do

  task :setup do
    ActiveRecord::Schema.define do
      connect
      begin
        databases.each do |database|
          #DB作成
          create_database database
          
          #権限付与及びユーザー作成
          execute "grant all privileges on #{database}.* to '#{user}'@'localhost' identified by '#{mypassword}'"
        end
      rescue
      end
    end
  end
  
  task :clean do
    ActiveRecord::Schema.define do
      connect
      begin
        execute "drop user '#{user}'@'localhost'"
      rescue
      end
      databases.each do |database|
        drop_database database
      end
    end
  end
end


1行目でenvironment.rbを読み込んでおかないと、次のエラーが発生する。

uninitialized constant ActiveRecord


uninitialized constant ActiveRecord が解決したにあるように、rake environment setupとやってもできるのですが、rake setupとやりたかったので、requireで読みこむ。

参考

かんたんRuby on RailsでWebアプリケーション開発

かんたんRuby on RailsでWebアプリケーション開発