-
rake db:migrate
との戦い。 - Ruby on Railsを使ったことがあるなら分かるはず。
- 互換性の維持って大変だ。
その1
えい。
bundle exec rake db:migrate RAILS_ENV=production
エラー。project
ってクラスにinherit_members_changed?
ってメソッドが無いらしい。
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
ってフィールドがあるはず。
after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}
スキーマをみる。うむ。
create_table "projects", :force => true do |t|
// 略
t.boolean "inherit_members", :default => false, :null => false
end
これに合わせて自力でテーブルを作成。パスワードはpassword
、データベース名はredmine_production
。なお、データベース名はデフォルトだとredmine
だがカスタムしてある。
mysql -u root -ppassword redmine_production -e 'alter table projects add column inherit_members boolean default false not null;'
その2
えい。
bundle exec rake db:migrate RAILS_ENV=production
エラー。repositories
ってテーブルにis_default
ってカラムが無いよとのこと。
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)
スキーマをみる。うむ。
create_table "repositories", :force => true do |t|
// 略
t.boolean "is_default", :default => false
end
自力で作成する。
mysql -u root -ppassword redmine_production -e 'alter table repositories add column is_default boolean default false;'
その3
えい。
bundle exec rake db:migrate RAILS_ENV=production
エラー。repositories
ってテーブルにis_default
ってカラム名があるのに作ろうとするなとのこと。さっき怒られたから作ったのに。
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'
マイグレーションの内容確認。さっきの操作と同じだ。
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
要らないので削除(移動)。
mv db/migrate/20120115143100_add_repositories_is_default.rb db/migrate/20120115143100_add_repositories_is_default.rb.back
その4
えい。
bundle exec rake db:migrate RAILS_ENV=production
エラー。inherit_members
ってテーブルにinherit_members
ってカラム名があるのに作ろうとするなとのこと。さっき怒られたから作ったのに。パターンが分かってきたぞ。
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コマンド直叩きと同じ操作。よし。
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
というわけでこれも要らないので削除(移動)。
mv db/migrate/20130202090625_add_projects_inherit_members.rb db/migrate/20130202090625_add_projects_inherit_members.rb.back
その5
えい。
bundle exec rake db:migrate RAILS_ENV=production
よし。
あとこれも忘れずに。これについては公式サイトを参照。
bundle exec rake generate_secret_token
bundle exec rake tmp:cache:clear
bundle exec rake tmp:sessions:clear