我目前有一个名为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
答案 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 将自动更新