こせきの技術日記

2006-12-18

[] ActionWebServiceでreturnsにActiveRecordをそのまま使いたくない場合

AWSで独自の戻り値の型を定義したい場合は、ActionWebService::Structを使う。

  class Person < ActionWebService::Struct
    member :id,         :int
    member :firstnames, [:string]
    member :lastname,   :string
    member :email,      :string
  end
  person = Person.new(:id => 5, :firstname => 'john', :lastname => 'doe')

ActiveRecordをメンバに指定することもできるみたい。

member :blog_entry, BlogEntry

2006-10-24

[] Rails開発 初期手順

$ rails appname

appnameディレクトリの中に色々できる。

$ ./script/server

http://localhost:3000アクセスできるのを確認。

DB作成用のシェルスクリプトSQLファイルを以下のrubyスクリプトを使って生成(MySQL用)。アプリケーションディレクトリにtmp.rb等適当な名前で保存して実行。引数に、DB名、DBユーザ名、DBパスワードを指定して実行する。

#! /usr/local/bin/ruby

Dir.mkdir("ext") rescue nil
Dir.mkdir("ext/bin") rescue nil
Dir.mkdir("ext/sql") rescue nil

open("./ext/bin/createdb.sh", "w") do |out|
  out.print <<-'EOT'
#! /bin/sh

DIR=`dirname $0`;
ENV=$1;
if [ -z $ENV ]; then
  ENV="development"
fi

SQL="$DIR/../sql/createdb_$ENV.sql";

echo "----- CREATE $ENV DATABASE ----";

if [ -f $SQL ]; then
  mysql -uroot -p --default-character-set=utf8 < $SQL
else
  echo "usage: $0 [development|test|production]"
fi
  EOT
end

open("./ext/bin/dropdb.sh", "w") do |out|
  out.print <<-'EOT'
#! /bin/sh

DIR=`dirname $0`;
ENV=$1;
if [ -z $ENV ]; then
  ENV="development"
fi

SQL="$DIR/../sql/dropdb_$ENV.sql";

echo "**** DROP $ENV DATABASE ****";

if [ -f $SQL ]; then
  mysql -uroot -p < $SQL
else
  echo "usage: $0 [development|test|production]"
fi
  EOT
end

%w(development test production).each do |env|

  file = "./ext/sql/createdb_#{env}.sql"
  open(file, "w") do |out|
    out.print <<-EOT
DROP DATABASE IF EXISTS #{ARGV[0]}_#{env};
CREATE DATABASE #{ARGV[0]}_#{env} DEFAULT CHARACTER SET utf8;
GRANT ALL ON #{ARGV[0]}_#{env}.* TO #{ARGV[1]}@'%' IDENTIFIED BY '#{ARGV[2]}';
    EOT
  end

  file = "./ext/sql/dropdb_#{env}.sql"
  open(file, "w") do |out|
    out.print <<-EOT
DROP DATABASE IF EXISTS #{ARGV[0]}_#{env};
    EOT
  end

end
  • ./ext/bin/createdb.sh
  • ./ext/bin/dropdb.sh
  • ./ext/sql/createdb_development.sql
  • ./ext/sql/createdb_test.sql
  • ./ext/sql/createdb_production.sql
  • ./ext/sql/dropdb_development.sql
  • ./ext/sql/dropdb_test.sql
  • ./ext/sql/dropdb_production.sql

が出力される。生成したらtmp.rbはもう要らないので削除

上で出力したスクリプトを使いDB作成。

$ ./ext/bin/createdb.sh development

./config/database.ymlを編集localhostは127.0.0.1に置換。WindowsMySQLでソケットファイルが見つからないエラーが出るので。


モデルを作成。マイレーション用のファイルも作成されるので次で編集

$ ./script/generate model Member

モデルを作らない場合のマイレーションファイル生成は以下。

$ ./script/generate migration AddMembersColumn

./db/migrate/001_create_members.rbファイル編集

class CreateMembers < ActiveRecord::Migration
  def self.up
    create_table :members do |t|
      t.column :name, :string
      t.column :email, :string, :limit => 64
      t.column :level, :int
      t.column :birthday, :datetime
    end
    create_index :members, :email, :unique => true
    create_index :members, [:name, :birthday]

    add_column :table, :column, :string, :limit=>100, :null=>false, :default=>'aaa'
  end

  def self.down
    drop_table :members

    remove_column :table, :column
  end
end

マイレーション

$ rake db:migrate
$ rake db:migrate RAILS_ENV=production

バージョン落とす場合。

$ rake db:migrate VERSION=0

db/schema.rbを生成する場合。

$ rake db:schema:dump

SQLを生成する場合。

$ rake db:structure:dump

scaffold生成。

$ ./script/generate scaffold Member