Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重新运行迁移-设计Gem_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 重新运行迁移-设计Gem

Ruby on rails 重新运行迁移-设计Gem,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在开发一个rails应用程序,并添加了用于验证用户身份的。现在,我正在进一步开发,我想添加Desive附带的一些模块(特别是可确认、可锁定和令牌可验证)。这些模块位于注释掉的原始迁移文件中。我想知道是否可以简单地取消对这些模块的注释,然后运行“rakedb:migrate”。你能像这样重新运行迁移吗,或者它会破坏什么 我本来会对此进行测试,但考虑到我在开发中投入的工作,我不想在这一点上破坏任何东西。以下是当前的迁移文件: class DeviseCreateUsers < Active

我正在开发一个rails应用程序,并添加了用于验证用户身份的。现在,我正在进一步开发,我想添加Desive附带的一些模块(特别是可确认、可锁定和令牌可验证)。这些模块位于注释掉的原始迁移文件中。我想知道是否可以简单地取消对这些模块的注释,然后运行“rakedb:migrate”。你能像这样重新运行迁移吗,或者它会破坏什么

我本来会对此进行测试,但考虑到我在开发中投入的工作,我不想在这一点上破坏任何东西。以下是当前的迁移文件:

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      ## Token authenticatable
      # t.string :authentication_token


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end
end
但是,我需要像创建原始迁移装置一样,向这个新迁移“添加_索引”。我是否将“add_index”放在迁移的底部(即,在“add_column”方法之后)?也许是这样的:

class AddConfirmableToUsers < ActiveRecord::Migration
  def change
    add_column :users, :price, :decimal
    add_column :users, :confirmation_token, :string
    add_column :users, :confirmed_at, :datetime
    add_column :users, :confirmation_sent_at, :datetime
    add_column :users, :unconfirmed_email, :string

    add_index :users, :confirmation_token,   :unique => true
  end
end
class AddConfirmableToUserstrue
结束
结束
作为总结:

  • 我是否可以重新运行迁移(编辑以前的迁移,然后运行 “rake db:migrate”)
  • 如果无法重新运行迁移,我将在哪里运行 是否在新迁移中放置“添加索引”行

  • 您不能只编辑文件并运行db:migrate。Rails跟踪哪些迁移已经运行,哪些还没有运行。Rails认为它已经运行了迁移

    正确的做法是按照上面的建议创建一个新的迁移


    听起来好像你担心你会把数据库弄得一团糟,失去很多工作。我建议您在执行此操作之前备份数据库。数据库备份和git有助于消除您不确定的更改带来的许多恐惧。

    这正是我所做的。正如我上面所写的那样编写新的迁移(只需在迁移的底部添加“add_index”)。
    class AddConfirmableToUsers < ActiveRecord::Migration
      def change
        add_column :users, :price, :decimal
        add_column :users, :confirmation_token, :string
        add_column :users, :confirmed_at, :datetime
        add_column :users, :confirmation_sent_at, :datetime
        add_column :users, :unconfirmed_email, :string
    
        add_index :users, :confirmation_token,   :unique => true
      end
    end