更新heroku生产中的列与本地中的列



我有一个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

最新更新