手动更新模型后更新db / migrate?

时间:2012-08-25 12:45:35

标签: ruby-on-rails activerecord model rake

例如,我有这个模型:

class Product < ActiveRecord::Base
  attr_accessible :name, :order
end

然后,当我rake db:migrate时,它创建了 db / migrate / 20120825132038_create_products.rb

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.integer :order
      t.string :name

      t.timestamps
    end
  end
end

但这一切都发生了,因为我使用了rails generate Product order:integer name:string

现在我转到产品型号并手动将其更改为:

class Product < ActiveRecord::Base
  attr_accessible :name, :order, :category_id

  validates :name, uniqueness: true
  belongs_to :category
end

如何使用更新自动更新 db / migrate / 20120825132038_create_products.rb

2 个答案:

答案 0 :(得分:17)

当您运行rake db:migrate时,没有创建db/migrate/20120825132038_create_products.rb。您运行

时创建了该迁移文件
rails generate Product order:integer name:string

attr_accessible与迁移数据库无关。

我强烈建议您阅读 Migrations 上的Rails指南,以及 Mass Assignment 上讨论{{ 1}}

要生成迁移文件(因为您提出的问题中提及的文件已经由您提及的上一个attr_accessible命令处理),请运行

rake db:migrate

这应生成一个包含

等内容的新迁移
rails g migration AddCategoryIdToProduct category_id:integer

现在再次运行class AddCategoryIdToProduct < ActiveRecord::Migration def change add_column :products, :category_id, :integer end end 将处理此迁移文件,将新的rake db:migrate整数列添加到您的category_id表中。

答案 1 :(得分:7)

您可以通过运行

重做迁移
rake db:migrate:up VERSION=20121031143418 #insert the timestamp on migration

你也可以重做一次迁移(向上和向下运行,但只有在你有一个向上和向下的情况下才能运行,你只需要进行更改就不会有效)

rake db:migrate:redo