2016-09-28 2 views
0

У меня есть приложение Ruby on Rails (v 4.2.0), которое развертывается в Heroku с помощью базы данных PostgresQL.Обновление столбцов в генерации героику vs local

У меня есть ряд объектов в моей БД, что я заселяю с моим файлом 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

Вам необходимо переписать файл семян, чтобы он мог работать с существующими данными. Нет волшебного способа сделать это. – meagar

+0

Выполнение 'heroku rake db: migrate' обновит вашу схему новым столбцом цены в таблице элементов. Он не должен влиять на таблицу пользователей, если нет какой-либо связи между ценами и пользователями, которых вы не упомянули. – heyitsjhu

+0

, кстати, вы можете попробовать что-то подобное в разработке, добавив столбец в таблицу, выполнив только «rake db: migrate», чтобы обновить схему, а затем подтвердите, что создаваемые вами пользователи все еще находятся в разработке. – heyitsjhu

ответ

1

Вы можете использовать find_or_create_by. Просто создайте еще одну миграцию и цикл над семенами. Что касается героку, это будет более безопасный способ изменить семена, не теряя производственных данных.

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