我有一个Ruby on Rails(v 4.2.0)应用程序,它使用PostgresQL数据库部署到Heroku。
我的数据库中有许多对象,我使用seeds.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
更有效,并手动编辑控制台中的所有信息。
答案 0 :(得分:1)
您可以使用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