Rails4でカラム変更(マイグレーション)

テーブルのカラム名及びデータ型を変更したのでメモ。
migrationでさくさくっとできた。

カラム名変更

usersテーブルの"mane"を"name"に変更
マイグレーションファイル作成

rails g migration RenameColumnToUsers

出来上がったマイグレーションファイルを編集

class RenameColumnToUsers <ActiveRecord::Migration
 def change
  rename_column :users, :mane, :name
 end
end

rename_columnの引数は対象テーブル、対象カラム名、変えたい名前。

データ型変更

usersテーブルのageのデータ型を"string"から"integer"に変更
マイグレーションファイル作成

rails g migration ChangeColumnToUsers

出来上がったマイグレーションファイルを編集

class ChangeColumnToUsers <ActiveRecord::Migration
 def change
  change_column :users, :age, :integer
 end
end

change_columnの引数は対象テーブル、対象カラム名、変えたいデータ型。

どちらもrake db:migrateを忘れずに。

redmineの移行 windows BitNami -> ubuntu

Windows Server2003で動いているBitNami redmine 2.1.6を
UbuntuServer 14(apache2 + passenger)へ移行したのでメモ。

移行するデータは2つ


1. MySQLのデータ
mysqldumpを使って吐き出す

mysqldump -p bitnami bitnami_redmine -pパスワード >dump.sql

mysqlコマンドで取り込む

mysql -u redmine -pパスワード データベース名 < dump.sql


2. 添付ファイル
redmine/htdocs/filesの内容をまるっとコピーしてredmine直下のfilesに貼り付ける
ハマったのが以下。

filesの権限はwww-data(apache2を動かしてるユーザ)でないと書き込みできない。
移行したファイルの権限はwww-dataで644。

sinatra + hamlでselectの初期値

sinatra + hamlでselectの初期値を設定するのに一苦労。

rubyの方はこんな感じ

get '/' do
  @kbn = 'B'
  haml :index
end

hamlはこんな感じ

%select
  %option
  %option{:value=>'A', :selected=>@kbn == 'A'} A
  %option{:value=>'B', :selected=>@kbn == 'B'} B
  %option{:value=>'C', :selected=>@kbn == 'C'} C

selected属性にtrueが入ればいいようなので、変数を比較させた。
もっと良い方法がある気がする。

rbenvでbundleのバージョン

bundleでrubyzipを導入しようとしたらruby >= 1.9.2が必要と言われた。
ruby -v で見ると

ruby 1.9.3p547 (2014-05-14 version 45962) ....

と出たのでおかしいなと思い、which bundleしたら

/usr/bin/bundle

そのbundleファイル見てみたら先頭に

#!/usr/bin/ruby

確かに/usr/bin/rubyにはOSインストール時に入っていた1.8のrubyしか無い。

http://qiita.com/emadurandal/items/a60886152a4c99ce1017
ここを参考にrbenvのgemでbundle入れて動かしてみた。

とりあえず動いたんだけど、unicorn動かすのに以下のように書かないといけなくてなんか変。

rbenv exec bundle exec unicorn

もっとしっかりruby、rbenv、gem、bundleについて調べねば。

CakePHP2のファイルダウンロードで大ハマリ

確信はない。

以下の様にファイルのダウンロードアクションを作成した。

function download($id = null){
  $file = $this->File->findById($id);
  
  $this->response->file(APP.'upload_files'.DS.$file['File']['name']);
  return $this->response;
}

すると、sqlログのところにwhere files.id = '/var/www/......'
というselect文が出力されている。
何故かこれのせいでエラー。

もしやと思ってテーブルとモデルの名前を変更。
FILES -> ATTACHMENTS
謎のsqlは出なくなり、ダウンロードも出来た。

FILEという名前のモデルはCakePHPが使っている?

ヘルパーで他のヘルパー参照【CakePHP2】

ヘルパーを自作するにあたって、セッションを扱いたかったのでヘルパー内でSessionヘルパーを呼び出した。
ただこれだけでオーケー。

public $helpers = array('Session');

ちなみに、viewの変数を扱うには以下の様にする。

$this->_View->get('hoge');

$thisの_Viewで扱えるみたい。