簡體   English   中英

Rails:我更新遷移文件然后運行db:migrate,但我的架構沒有更新

[英]Rails: I update migration file then run db:migrate, but my schema isn't updating

我正在嘗試在我的一個表中添加一個額外的字段。

我在遷移文件中添加了該字段(在db \\ migrate下),然后運行了'rake db:migrate',它運行沒有麻煩。 我的文本編輯器甚至告訴我我的schema.db文件已經更新,需要刷新。

模式文件不包含我的新字段,任何從我的視圖引用該字段的嘗試都會失敗。

我該怎么做呢? 可以通過rails更新帶有額外字段的表,而不必完全刪除並重新創建數據庫嗎?

http://guides.rubyonrails.org/migrations.html#changing-existing-migrations

編寫遷移時偶爾會出錯。 如果您已經運行了遷移,那么您不能只編輯遷移並再次運行遷移:Rails認為它已經運行了遷移,因此在運行rake db:migrate時不會執行任何操作。 您必須回滾遷移(例如使用rake db:rollback ),編輯遷移,然后運行rake db:migrate以運行更正的版本。

在數據庫中添加/更改內容時,應始終創建新的遷移文件。 這是遷移的目的。 遷移文件應該能夠進行新的更改並撤消更改。 這樣一來,如果出現問題或您改變主意,您可以輕松回滾到之前的遷移。

以下鏈接標記為“遷移剖析”和“編寫遷移”的部分可能對您有所幫助。

http://guides.rubyonrails.org/migrations.html

解決了我自己的問題..

基本上,不是編輯運行腳手架時生成的原始遷移文件,而是創建一個新的遷移文件,僅用於您想要實現的目標:

http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration

我做了同樣的事情,我想改變一個字段名稱,而不是這個:

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :commenter
      t.text :body

      # this line adds an integer column called `article_id`.
      t.references :article, index: true

      t.timestamps
    end
  end
end

我變了

  t.text :body

t.text :comment_body

我試着做耙子

db:migrate

沒有發生任何事情,因為它沒有任何輸出再次進入命令提示符...,我看着堆棧溢出, 引導我做耙

db:migrate:redo

外出

== 20141129044056 CreateComments: reverting ===================================
-- drop_table(:comments)
   -> 0.0000s
== 20141129044056 CreateComments: reverted (0.0886s) ==========================

== 20141129044056 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0040s
== 20141129044056 CreateComments: migrated (0.0040s) ==========================

然后我用commenter_body而不是body加載我的頁面/控制器,它完全加載。

我認為這也是同樣的解決方案。 我不知道在模型/數據庫的底層工作中是否有任何問題(我仍然是RoR的新手,我實際上是第三天......)

通過運行rake db:schema:dump我能夠通過后面的遷移重新生成我的模式

不知道這是否適用,但值得一試。 直接“ 使用Rails進行敏捷開發,第3版 ”:

有時,此schema_migrations表可能會導致問題。 例如,如果在向文件添加任何模式定義語句之前創建遷移源文件並運行db:migrate ,則數據庫將認為它已更新,並且模式信息表將包含新的版本號。
如果您隨后編輯該現有遷移文件並再次運行db:migrate ,則Rails將無法應用您的新更改。 在這些情況下,通常最簡單的方法是刪除數據庫,重新創建數據庫並重新運行遷移。

一旦你做了rake db:migrate,那么你再也無法在該文件中添加列。你必須使用rails g migration add_columnname_to_tablename生成一個新的遷移文件,用於添加該特定列並執行rake db:migrate。這就是它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM