2013-02-05 50 views
3

我有一個問題來恢復上次遷移。rake db:回滾恢復錯誤的遷移

自從我安裝'letrate'gem for rating後,任何rake db:rollback都會精確地恢復遷移,而不是最後一次遷移。

我懷疑這是由於寶石本身。

任何想法如何解決這個問題,所以我可以享受非常方便的回滾?

同樣發出相同的用:

rake db:migrate:redo 

結果:

== CreateRates: reverting ==================================================== 
-- drop_table(:rates) 
    -> 0.0224s 
== CreateRates: reverted (0.0225s) =========================================== 

== CreateRates: migrating ==================================================== 
-- create_table(:rates) 
NOTICE: CREATE TABLE will create implicit sequence "rates_id_seq" for serial column "rates.id" 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "rates_pkey" for table "rates" 
    -> 0.1787s 
-- add_index(:rates, :rater_id) 
    -> 0.0032s 
-- add_index(:rates, [:rateable_id, :rateable_type]) 
    -> 0.0024s 
== CreateRates: migrated (0.1850s) =========================================== 

耙分貝:遷移:狀態

... 
    up  20121205224038 Rename user address column 
    up  20121206125016587 ********** NO FILE ********** 
    up  20121206125016605 ********** NO FILE ********** 
    up  20121210152550 Create reservations 
    up  20121210180233 Create transactions 
    up  20121210215840 ********** NO FILE ********** 
    up  20121218144200 Create videos 
    up  20121218144800 Add video to videos 
    up  20130108225007 Devise invitable add to users 
    up  20130130202046 Acts as taggable on migration 
    up  20130205154206 Create commissions 
    up  20130207133520 Add user id to event transition 

和文件

[email protected] 1 joel staff 137 Dec 7 16:40 20121205224038_rename_user_address_column.rb 
[email protected] 1 joel staff 443 Dec 7 16:40 20121206125016587_create_rating_caches.rb 
[email protected] 1 joel staff 432 Dec 7 16:40 20121206125016605_create_rates.rb 
[email protected] 1 joel staff 429 Dec 10 23:30 20121210152550_create_reservations.rb 
[email protected] 1 joel staff 414 Dec 10 19:03 20121210180233_create_transactions.rb 
[email protected] 1 joel staff 237 Dec 18 15:44 20121218144200_create_videos.rb 
[email protected] 1 joel staff 172 Dec 18 16:18 20121218144800_add_video_to_videos.rb 
[email protected] 1 joel staff 758 Jan 8 23:50 20130108225007_devise_invitable_add_to_users.rb 
-rw-r--r-- 1 joel admin 775 Jan 30 21:20 20130130202046_acts_as_taggable_on_migration.rb 
[email protected] 1 joel admin 422 Feb 5 17:05 20130205154206_create_commissions.rb 
[email protected] 1 joel admin 266 Feb 7 15:20 20130207133520_add_user_id_to_event_transition.rb 

回答

5

好的,問題是您的letrate遷移的版本號。 Rails只是通過遷移文件中的時間戳來了解哪一個是最近應用的。在時間戳中還有3位數字,20121206125016605_create_rates.rb20121206125016587_create_rating_caches總是會被檢測爲最後一次遷移。

讓我們嘗試解決它並清理您的遷移狀態。首先回滾有問題的遷移:

rake db:rollback STEP=2 

rake db:migrate:status現在看起來應該像這樣:

up  20121205224038 Rename user address column 
up  20121210152550 Create reservations 
up  20121210180233 Create transactions 
up  20121210215840 ********** NO FILE ********** 
up  20121218144200 Create videos 
up  20121218144800 Add video to videos 
up  20130108225007 Devise invitable add to users 
up  20130130202046 Acts as taggable on migration 
up  20130205154206 Create commissions 
up  20130207133520 Add user id to event transition 

現在讓我們來釐定其版本號(假設你的遷移是在默認db/migrate文件夾)

mv db/migrate/20121206125016605_create_rates.rb db/migrate/20121206125017_create_rates.rb 
mv db/migrate/20121206125016587_create_rating_caches.rb db/migrate/20121206125016_create_rating_caches.rb 

現在您的db:migrate:status應該看起來像這樣:

up  20121205224038 Rename user address column 
down 20121206125016 Create rating caches 
down 20121206125016 Create rates 
up  20121210152550 Create reservations 
up  20121210180233 Create transactions 
up  20121210215840 ********** NO FILE ********** 
up  20121218144200 Create videos 
up  20121218144800 Add video to videos 
up  20130108225007 Devise invitable add to users 
up  20130130202046 Acts as taggable on migration 
up  20130205154206 Create commissions 
up  20130207133520 Add user id to event transition 

現在「時間線」是固定的,但我們仍然需要重新應用這些遷移。 rake db:migrate不會起作用,因爲上次遷移現在20130207133520_add_user_id_to_event_transition.rb而且它已經被應用如此耙認爲它是最新的......所以我們要騙耙:編輯後20121206125017_create_rates.rb會在每次遷移文件通過註釋down方法中的所有內容輸出遷移狀態。如果只有change方法,請對其進行註釋並創建空的向上和向下方法。因此,所有這些方法下跌將是這樣的:

def down 
    # This is the old code 
    # which I will uncomment later... 
end 

您還需要因爲不具有關聯文件(********** NO FILE **********一個),一個奇怪的遷移創建一個空的遷移。因此,創建一個名爲db/migrate/20121210215840_ghost_migration的文件。RB具有以下內容:

class GhostMigration < ActiveRecord::Migration 
    def up 
    end 

    def down 
    end 
end 

現在我們已經準備好來模擬滾動所有的方式回來。所以,做

rake db:rollback STEP=9 

遷移狀態輸出現在應該

up  20121205224038 Rename user address column 
down 20121206125016 Create rating caches 
down 20121206125016 Create ratings 
down 20121210152550 Create reservations 
down 20121210180233 Create transactions 
down 20121210215840 Ghost migration 
down 20121218144200 Create videos 
down 20121218144800 Add video to videos 
down 20130108225007 Devise invitable add to users 
down 20130130202046 Acts as taggable on migration 
down 20130205154206 Create commissions 
down 20130207133520 Add user id to event transition 

現在,您可以通過取消註釋更改文件還原至其原來的狀態是什麼,你之前的評論,並刪除了「鬼遷移」文件。 你應該真正的註釋,我們之前用下來的方法做了「向上」的方法,以同樣的方式,去掉「鬼遷移」文件和遷移一切你在文件和事情註釋掉

rake db:migrate 

最後的註釋去掉一切都應該在那之後(我希望)平穩運行。

關於爲什麼發生在第一位,我認爲這實際上是由於寶石本身,我認爲這不應該產生與無效(或至少非標準)版本號的遷移。它看起來像寶石在同一秒生成兩個遷移,所以也許作者添加了這3個額外的數字,以防止版本號衝突。我認爲在同一次遷移中完成所有事情會更好。

我希望這可以幫助你解決你的問題!

UPDATE

也許我過於複雜的事情。如果你不介意實際回滾所有的遷移,然後再次遷移它們,你不需要對任何文件發表評論(儘管如此,「Ghost遷移」技巧仍然是必要的)。我只是覺得這樣會更安全。

+0

要儘快嘗試。非常感謝。我會看看如果我已經可以給你+50賞金。你真的應得的。 – zabumba

+1

沒問題,我只希望它能像我期望的那樣工作,你會得到解決的。 :) – deivid