2017-05-25 72 views
0

在這article,我不明白是什麼問題,如果您運行rake db:migrate而不是rake db:schema:load。作者說,這是Rails模型與遷移過程有什麼關係?

,因爲你的第一個移民「create_posts」這是必要的 您已經定義了翻譯的屬性:從Post模型的翻譯標題:標題和:後 示範文本,但你刪除。

但是爲什麼您需要「在Post模型中定義可翻譯的屬性:標題和:文本」?如果您只是在運行遷移,那麼這與您的模型文件有什麼關係?遷移和數據庫不檢查您的模型文件的任何事情嗎?運行rake db:migrate只是簡單地通過只看您的遷移和翻譯內部的這些rails方法到SQL命令爲您建立一個新的數據庫,然後爲您生成一個新的schema.rb文件對嗎?爲什麼它關係到你模型中的內容?

回答

1

但是爲什麼您需要「在Post模型中定義可翻譯的屬性:標題和:文本」?如果您只是在運行遷移,那麼這與您的模型文件有什麼關係?

首先,遷移文件只是一個紅寶石文件。你可以寫任何代碼裏面它:

代碼的類型在遷移文件:

  1. 平時他們遷移方法create_tableadd_column

    • 這些是你的模型的不可知論,這意味着這些不關心你的模型。嘗試刪除您的模型文件,然後使用rake db:migrate運行create_table遷移文件,您會注意到它成功無誤。
  2. 有時,它們被強耦合/依賴於當前的模型文件的內容(或者可以實際上取決於aaaany代碼)。這些是而不是默認的Rails遷移方法,並且通常是您的一個或多個寶石甚至您自己的代碼實現(如果有的話)的API方法。在你的榜樣,看着article,我注意到一個非Rails的遷移方法:

    class CreatePosts < ActiveRecord::Migration 
        def up 
        create_table :posts do |t| 
         t.timestamps 
        end 
    
        # this is not a Rails migration method 
        Post.create_translation_table! title: :string, text: :text 
        end 
    end 
    
    • Post.creation_translation_table!以上,我認爲是從的方法全球化寶石,因爲它不是一個Rails遷移方法,如果代碼依賴於當前代碼中的「某些內容」,我們無法確定。我可以假設上面的命令就是這樣,因爲文章說

      你會得到大錯誤!

    • 這就是爲什麼文章說,從一個全新的數據庫遷移時使用rake db:schema:load而非rake db:migrate

      • 因爲rake db:migrate運行WHATEVER內的每個遷移文件的所有代碼
      • rake db:schema:load只運行一個文件,它是schema.rb,它只是普通的數據庫信息,並沒有可能干擾/引發錯誤的外部代碼。

      • 儘管...我可能實際上更新了「BROKEN」遷移文件,以便rake db:migrate可以正常運行,前提是我確定遷移錯誤是從非Rails方法我的代碼的特定版本。

+0

所以你說,在全球化的寶石很可能會參考模型文件,所以運行結構,它只是更安全:負荷? – stackjlei

+0

最有可能的是。然而,爲了確保,我閱讀了全球化的gem自述文件,並且確切地發現'.create_translation_table!'方法取決於模型代碼(參見[here](https://github.com/globalize/globalize#creating-我引用:「另請注意,在創建翻譯表之前,必須通過模型中的翻譯來定義翻譯後的屬性,如上所示。」 –

+1

只有當您還有另一個遷移文件時:「從posts_translations表中刪除:標題」,並且在從郵件中刪除':title'時立即運行此遷移文件,它將會更「安全」模型。請參閱[文檔中的dir.down](https://github.com/globalize/globalize#adding-additional-fields-to-the-translation-table),瞭解如何創建遷移文件,以便刪除可翻譯的屬性。這很重要,因爲在你運行這個遷移文件之後,它會更新你的'schema.rb',這樣'post_translations'表就不會再... –