Redmineの0.8.2から2.5.1へのアップグレードでrake db:migrateに失敗する場合のメモ


- `rake db:migrate`との戦い。
- Ruby on Railsを使ったことがあるなら分かるはず。
- 互換性の維持って大変だ。

## その1

えい。

```bash
bundle exec rake db:migrate RAILS_ENV=production
```

エラー。`project`ってクラスに`inherit_members_changed?`ってメソッドが無いらしい。

```bash
rake aborted!
An error has occurred, all later migrations canceled:

inherit_members_changed?' for #<Project:0xa6fb738>/srv/rails/redmine/app/models/project.rb:83:in `block in <class:Project>'
/srv/rails/redmine/app/models/project.rb:4
```

ソースを見る。grepするとこのメソッドが使われているのは以下の場所だけ。以下によると`projects`というテーブルに`inherit_members`ってフィールドがあるはず。

```app/models/project.rb
  after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}
```

スキーマをみる。うむ。

```db/schema.rb 
  create_table "projects", :force => true do |t|
	// 略
    t.boolean  "inherit_members",                :default => false, :null => false
  end
```

これに合わせて自力でテーブルを作成。パスワードは`password`、データベース名は`redmine_production`。なお、データベース名はデフォルトだと`redmine`だがカスタムしてある。

```bash
mysql -u root -ppassword redmine_production -e 'alter table projects add column inherit_members boolean default false not null;'
```

## その2

えい。

```bash
bundle exec rake db:migrate RAILS_ENV=production
```

エラー。`repositories`ってテーブルに`is_default`ってカラムが無いよとのこと。

```bash
rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Unknown column 'is_default' in 'where clause': SELECT  `repositories`.* FROM `repositories`  WHERE `repositories`.`project_id` = 2 AND (is_default = 1) LIMIT 1/srv/rails/redmine/app/models/project.rb:1037:in `set_or_update_position_under'
/srv/rails/redmine/app/models/project.rb:424:in `block (2 levels) in rebuild_tree!'
/srv/rails/redmine/app/models/project.rb:424:in `each'
/srv/rails/redmine/app/models/project.rb:424:in `block in rebuild_tree!'
/srv/rails/redmine/app/models/project.rb:421:in `rebuild_tree!'
/srv/rails/redmine/db/migrate/105_build_projects_tree.rb:3:in `up'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
```

スキーマをみる。うむ。

```db/schema.rb 
  create_table "repositories", :force => true do |t|
	// 略
    t.boolean  "is_default",                  :default => false
  end
```

自力で作成する。

```bash
mysql -u root -ppassword redmine_production -e 'alter table repositories add column is_default boolean default false;'
```


## その3

えい。

```bash
bundle exec rake db:migrate RAILS_ENV=production
```

エラー。`repositories`ってテーブルに`is_default`ってカラム名があるのに作ろうとするなとのこと。さっき怒られたから作ったのに。

```bash
rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name 'is_default': ALTER TABLE `repositories` ADD `is_default` tinyint(1) DEFAULT 0/srv/rails/redmine/db/migrate/20120115143100_add_repositories_is_default.rb:3:in `up'
```

マイグレーションの内容確認。さっきの操作と同じだ。

```db/migrate/20120115143100_add_repositories_is_default.rb
class AddRepositoriesIsDefault < ActiveRecord::Migration
  def self.up
    add_column :repositories, :is_default, :boolean, :default => false
  end

  def self.down
    remove_column :repositories, :is_default
  end
end
```

要らないので削除（移動）。

```bash
mv db/migrate/20120115143100_add_repositories_is_default.rb db/migrate/20120115143100_add_repositories_is_default.rb.back
```


## その4

えい。

```bash
bundle exec rake db:migrate RAILS_ENV=production
```

エラー。`inherit_members`ってテーブルに`inherit_members`ってカラム名があるのに作ろうとするなとのこと。さっき怒られたから作ったのに。パターンが分かってきたぞ。

```bash
rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name 'inherit_members': ALTER TABLE `projects` ADD `inherit_members` tinyint(1) DEFAULT 0 NOT NULL/srv/rails/redmine/db/migrate/20130202090625_add_projects_inherit_members.rb:3:in `up'
```

マイグレーションの内容を確認。さっきSQLコマンド直叩きと同じ操作。よし。

```db/migrate/20130202090625_add_projects_inherit_members.rb
class AddProjectsInheritMembers < ActiveRecord::Migration
  def up
    add_column :projects, :inherit_members, :boolean, :default => false, :null => false
  end

  def down
    remove_column :projects, :inherit_members
  end
end
```

というわけでこれも要らないので削除（移動）。

```bash
mv db/migrate/20130202090625_add_projects_inherit_members.rb db/migrate/20130202090625_add_projects_inherit_members.rb.back
```

## その5

えい。

```bash
bundle exec rake db:migrate RAILS_ENV=production
```

よし。

あとこれも忘れずに。これについては[公式サイト](http://redmine.jp/guide/RedmineUpgrade/)を参照。 

```bash
bundle exec rake generate_secret_token
bundle exec rake tmp:cache:clear
bundle exec rake tmp:sessions:clear
```