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

时间:2016-09-28 18:17:21

标签: ruby-on-rails ruby postgresql activerecord heroku

我有一个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更有效,并手动编辑控制台中的所有信息。

1 个答案:

答案 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