2016-09-28 4 views
0

Ich habe eine Ruby on Rails (v 4.2.0) App, die Heroku mit einer PostgresQL-Datenbank bereitgestellt wird.Aktualisieren von Spalten in Heroku-Produktion im Vergleich zu lokalen

Ich habe eine Reihe von Objekten in meinem db, die ich mit meiner seeds.rb Datei zu füllen:

Item.create([ 
    {name: "Kale", type: "veggie"}, 
    {name: "Apple", type: "fruit"}, 
    {name: "MF Kombucha", type: "drink"}, 
    {name: "Cider", type: "drink"}, 
    {name: "Carrot", type: "veggie"} 
    ]) 

Ich brauche eine Spalte meiner items Tabelle hinzuzufügen, :price:

rails g migration AddPriceToItems

class AddPriceToItems < ActiveRecord::Migration 
    def change 
    add_column :items, :price, :integer 
    end 
end 

ich dann meine Samen-Datei aktualisieren:

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} 
    ]) 

Lokal ist das völlig in Ordnung. Ich synchronisieren diese neuen Daten mit anderen Daten in der Samen-Datei:

rake db:drop

rake db:create

rake db:migrate

rake db:seed

jedoch in der Produktion, jetzt die Datenbank hat Benutzerdaten eingegeben. Das Löschen der Datenbank würde das Löschen der Benutzerdaten bedeuten.

Gibt es eine Möglichkeit, die neue Seeds-Datei mit der Produktionsdatenbank zu synchronisieren, ohne die Datenbank löschen zu müssen? Im Idealfall wäre dies effizienter als heroku run rails c und manuelle Bearbeitung aller Informationen in meiner Konsole.

+1

Sie müssen Ihre Seeds-Datei neu schreiben, so dass sie gegen vorhandene Daten laufen kann. Es gibt keinen magischen Weg, dies zu tun. – meagar

+0

läuft 'heroku rake db: migrate' aktualisiert Ihr Schema mit der neuen Preisspalte in der Items-Tabelle. Es sollte die Benutzertabelle nicht beeinflussen, es sei denn, es gibt eine Art von Assoziation zwischen Preisen und Benutzern, die Sie nicht erwähnt haben. – heyitsjhu

+0

Übrigens können Sie etwas Ähnliches in der Entwicklung ausprobieren, indem Sie einer Tabelle eine Spalte hinzufügen, die nur 'rake db: migrate 'ausführt, um das Schema zu aktualisieren, und dann bestätigen, dass die von Ihnen erstellten Benutzer noch in der Entwicklung sind. – heyitsjhu

Antwort

1

Sie können find_or_create_by verwenden. Erstellen Sie einfach eine weitere Migration und Schleife über die Samen. Was heroku betrifft, so wird dies ein sicherer Weg sein, Samen zu wechseln, ohne Produktionsdaten zu verlieren.

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 
Verwandte Themen