Rails 3 で最初に作成した Rails アプリがあり、約 1 か月前に Rails 3.1.10 にアップグレードしました。関連するデータベースの移行とともに、ストーリーとタグの間の habtm 関連付けを作成しました。
class Story < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :tags, :uniq => true
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :stories, :uniq => true
end
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :name
t.timestamps
end
end
end
class CreateStoriesTags < ActiveRecord::Migration
def change
create_table :stories_tags, :id => false do |t|
t.references :story, :tag
end
add_index :stories_tags, [:story_id, :tag_id]
end
end
最後に、関連する schema.db を次に示します。
create_table "stories", :force => true do |t|
t.string "title"
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "stories", ["user_id"], :name => "index_stories_on_user_id"
create_table "stories_tags", :id => false, :force => true do |t|
t.integer "story_id"
t.integer "tag_id"
end
add_index "stories_tags", ["story_id", "tag_id"], :name => "index_stories_tags_on_story_id_and_tag_id"
create_table "tags", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
DB を移行してから、コンソールで関連付けをいじりました。次に、移行をロールバックして、タグ テーブルにいくつかの列を追加します。(単純に新しい移行を作成できることはわかっていますが、それでもこの問題に直面している理由を理解したいと思います。)ここでrake db:rollback
、コンソールに挿入すると、最初の出力が次のようになります。
[nw0.0.1master (development)]$ rake db:rollback
== CreateStoriesTags: reverting ==============================================
-- drop_table(:stories_tags)
ここまでは順調ですが、レーキ タスクがハングします。. . 何時間も。ここから ctrl-c すると、コンソールへの出力が次のようになります。
^Crake aborted!
An error has occurred, this and all later migrations canceled:
Interrupt: : ROLLBACK
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/postgresql_adapter.rb:605:in `async_exec'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/postgresql_adapter.rb:605:in `block in execute'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/abstract_adapter.rb:245:in `block in log'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activesupport-3.1.10/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/abstract_adapter.rb:240:in `log'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/postgresql_adapter.rb:604:in `execute'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/postgresql_adapter.rb:664:in `rollback_db_transaction'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/abstract/database_statements.rb:201:in `rescue in transaction'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/connection_adapters/abstract/database_statements.rb:182:in `transaction'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/transactions.rb:208:in `transaction'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:742:in `ddl_transaction'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:686:in `block in migrate'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:671:in `each'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:671:in `migrate'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:553:in `down'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:627:in `move'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/migration.rb:541:in `rollback'
/.rvm/gems/ruby-1.9.2-p290@rails3firstgemset/gems/activerecord-3.1.10/lib/active_record/railties/databases.rake:232:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:rollback
(See full trace by running task with --trace)
このアプリは Rails 3.0 で開始されたため、初期の移行はすべて古いClass.up Class.down
方法を使用して移行を定義することに注意してください。また、最初にハングを経験したとき、CreateStoriesTags 移行を使用up
およびdown
インスタンス メソッドに切り替えましたが、すべてがまだハングしていました。
PGAdmin3 Workbench もハングしていることに気付きました。そのため、Mac を再起動したところ、ロールバックが機能するようになりました。