Rails生成迁移

时间:2013-03-01 16:14:32

标签: ruby-on-rails-3.1

我目前有一个名为Products的迁移,我只想在此迁移中添加更多字符串,例如描述和产品类型。做这个的最好方式是什么?

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string  :name
      t.decimal :price
      t.text    :description
      t.timestamps
    end
   end
 end

5 个答案:

答案 0 :(得分:64)

跑步

rails g migration add_description_to_products description:string
rails g migration add_product_type_to_products product_type:string

然后运行

rake db:migrate

答案 1 :(得分:17)

在开发任何实际应用程序时,您将进行一些基本上是DDL(数据定义语言)语句的迁移。在现实生活中,您将拥有多个环境(开发,测试,生产等),并且您很可能在生产版本时更改开发数据库。因此,Rails方法是为数据库的任何更改生成新的迁移,而不是直接更改现有的迁移文件。

因此,请熟悉迁移。

对于具体问题,您可以这样做:

rails g migration add_attributes_to_products attr1 attr2 attr3

这将生成一个新的迁移文件,用于向产品表(到产品型号)添加3个新属性。属性的默认类型是string。对于其他人,您可以指定它:

rails g migration add_attributes_to_products attr1:integer attr2:text attr3:enum

答案 2 :(得分:2)

假设您使用上面的迁移创建了表,然后添加product_type(您已经有描述),您可以这样做:

# db/migrate/20130201121110_add_product_type_to_product.rb

class AddProductTypeToProduct < ActiveRecord::Migration
  def change
    add_column :products, :product_type, :string
    Product.all.each do |product|
      product.update_attributes!(:product_type => 'unknown')
    end
  end
end

答案 3 :(得分:1)

如果您的上一个操作是rollback

,请

使用migration

rake db:rollback

然后在迁移文件中添加属性

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string  :name
      t.decimal :price
      t.text    :description
      t.string  :product_type  #adding product_type attribute to the products table
      t.timestamps
    end
   end
 end

之后使用

进行迁移
rake db:migrate

如果迁移不是您的上一个操作,请生成上述答案中的新迁移文件

rails g migration add_attributes_to_products product_type:string

上述代码仅生成迁移文件,但您希望使用rake db:migrate来迁移文件。

如果您想对该迁移文件进行更多更改,例如添加更多属性,请在迁移之前执行此操作,否则如果您的上一个操作是迁移,则必须使用我在开头提到的方法,否则您需要生成另一个迁移文件。 查看此链接以了解有关迁移的更多信息 http://guides.rubyonrails.org/v3.2.8/migrations.html

答案 4 :(得分:0)

rails生成迁移add_description_to_products

AddDescriptionToProducts < ActiveRecords:: Migration[v]
  def change
    add_column :products :description :string
    add_column :name_of_table :name_of_column :data_type
  end

运行rake db:migrate,您的 schema.rb 将自动更新