我有一个Ruby on Rails (v4.2.0)应用程序,它被部署到Heroku,与PostgresQL数据库。
我的数据库中有许多对象,我用我的种子填充。Rb文件:
Item.create([
{name: "Kale", type: "veggie"},
{name: "Apple", type: "fruit"},
{name: "MF Kombucha", type: "drink"},
{name: "Cider", type: "drink"},
{name: "Carrot", type: "veggie"}
])
我需要添加一个列到我的items
表,:price
:
rails g migration AddPriceToItems
class AddPriceToItems < ActiveRecord::Migration
def change
add_column :items, :price, :integer
end
end
然后更新我的种子文件:
Item.create([
{name: "Kale", type: "veggie", price: 2},
{name: "Apple", type: "fruit", price: 1},
{name: "MF Kombucha", type: "drink", price: 10000},
{name: "Cider", type: "drink", price: 2},
{name: "Carrot", type: "veggie", price: 1}
])
在局部,这完全没问题。我将这个新数据与种子文件中的其他数据同步:
rake db:drop
rake db:create
rake db:migrate
rake db:seed
但是,在生产中,数据库现在有用户输入的数据。删除数据库意味着删除用户数据。
是否有一种方法来同步新的种子文件与生产数据库,而不必删除数据库?理想情况下,这将比heroku run rails c
和手动编辑控制台中的所有信息更有效。
您可以使用 find_or_create_by
。再来一次迁徙,在种子上循环。对于heroku来说,这将是一种更安全的方式,可以在不丢失生产数据的情况下更换种子。
class AddPriceToItemSeeds < ActiveRecord::Migration
def change
items= [
{name: "Kale", type: "veggie", price: 2},
{name: "Apple", type: "fruit", price: 1},
{name: "MF Kombucha", type: "drink", price: 10000},
{name: "Cider", type: "drink", price: 2},
{name: "Carrot", type: "veggie", price: 1}
]
items.each do |item|
Item.find_or_create_by(name: item[:name], type: item[:type]) do |record|
record.price= item[:price]
end
end
end
end