【问题标题】:Update db/migrate after manually updating models?手动更新模型后更新 db/migrate?
【发布时间】:2012-08-20 18:24:12
【问题描述】:

例如我有这个模型:

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

【问题讨论】:

    标签: ruby-on-rails activerecord model rake


    【解决方案1】:

    当您运行 rake db:migrate 时,它没有创建 db/migrate/20120825132038_create_products.rb。该迁移文件是在您运行时创建的

    rails generate Product order:integer name:string
    

    attr_accessible 与迁移数据库无关。

    我强烈建议您阅读 Migrations 上的 Rails 指南,以及 Mass Assignment 上讨论 attr_accessible 的部分。强>

    要生成一个新的迁移文件(因为你的问题中提到的那个已经被你提到运行的上一个rake db:migrate命令处理了),运行 p>

    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 整数列添加到您的products 表中。

    【讨论】:

    • 感谢您的精彩解释!但是每次我想向模型添加一个属性/属性(无论你怎么称呼它)我都需要使用 rails g 迁移并创建一个新类?
    • 如果迁移已经应用到数据库,。模型只不过是一个接口,您可以通过它与数据库进行交互。它不会操纵数据库的结构;这就是迁移的目的。向表中添加列将自动使新的属性方法在关联模型中可用。
    • 是的。总是创建一个新的迁移——即使只有一列。永远不要回去编辑旧的迁移。这是一个好习惯!相信我,你未来的同事会感谢我确保你遵循这种做法。
    【解决方案2】:

    您可以通过运行重做迁移

    rake db:migrate:up VERSION=20121031143418 #insert the timestamp on migration
    

    您还可以重做迁移(上下运行,但只有在上下运行时才有效,当您进行更改时不会这样做)

    rake db:migrate:redo
    

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多