2017-05-18 3 views
0

Ich habe meiner App das Device gem für logIn hinzugefügt. Meine Seite ist ein Geschäft und ein Benutzer hat viele Aufträge und ich füge hinzu in Modell Benutzer:Ruby on Rails - Rake db: seed abgebrochen

class User < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    has_many :comandas #I add this line, comandas = orders in Spanish 
end 

Und in der Migrate-Datei von Comandas (Aufträge) Ich habe diese:

class CreateComandas < ActiveRecord::Migration[5.0] 
    def change 
    create_table :comandas do |t| 
     t.belongs_to :user, index: true #references to user 
     t.float :total 
     t.timestamps 
    end 
    end 
end 

Und jetzt ich m testet die Datenbank mit der Seeds-Datei, aber wenn ich einen Comanda zu einem Benutzer hinzufüge, dann erhebe ich den Fehler, dass Rake abgebrochen wird.

Mein Samen Datei:

c1 = Comanda.create(total: 100) 
u1 = User.find_by email: "[email protected]" 
u1.comandas << [c1] 

I'created die vor Benutzer.

Fehler: Screen shot of shell

UPDATE:

fand ich endlich das Problem. Das Problem war, dass ich alle Modelle erstellt habe, bevor diese Modifikation hinzugefügt wurde. Und als ich diese Beziehung hinzufügte, änderte Rails mir die Datenbank nicht. Ich überprüfte dies in die sqlite-Befehlszeile und listet die Spalten der Comandas-Tabelle auf. Und ich habe gesehen, dass der Hinweis auf Benutzer nicht hier war. Und entscheiden Sie alle Datenbank die Ausführung des Befehls zu löschen:

rake db:drop db:create db:migrate 

und nachdem ich einen Benutzer hinzugefügt und ich laufe:

rake db:seed 

und funktioniert! Danke an alle für die Hilfe!

+0

Wollen Sie die Benutzer nicht zuerst erstellen? – ediblecode

+0

Ich habe den Benutzer bereits erstellt, becuase, wenn ich den Rake db: seed ohne letzte Zeile, wo ich die Comanda zu Benutzer hinzufügen, funktioniert es. – Xavi

+0

Das Löschen der letzten Zeile beweist nicht, dass "u1" nicht null ist – ediblecode

Antwort

0

Fügen Sie user_id in comandas Tabelle hinzu.

hinzufügen Migration user_id hinzuzufügen:

rails g migration AddUserIdToCommando user_id:integer 
0

Das Comanda Modell nicht eingeschlossen ist, aber ich kann die mögliche Ursache für dieses Verhalten erraten.

Erstens, was wahrscheinlich arbeiten, und ist kompatibel mit dem aktuellen db-Modell zugrunde liegt:

c1 = Comanda.new(total: 100) 
u1 = User.find_by email: "[email protected]" 
c1.user_id = u1.id 
c1.save! 

Das User-Modell hat keine Ahnung davon Kinderfremdschlüssel ist, der Spalte ‚user_id‘ des Comandas Tisch. Es ist intuitiver zu sehen, dass das Comanda-Modell dafür verantwortlich ist, seine eigenen db-Spalten zu speichern.

Allerdings kann ich denke, dass aufgrund der Tatsache, dass die jüngsten Versionen von Rails die belongs_to Beziehung standardmäßig erzwingen, wenn Sie zu tun versuchen -

c1 = Comanda.create(total: 100) 

es fehlschlägt, da durch Comanda.create mit nicht Comanda.new, Sie versuchen, ein neues Comanda-Objekt mit einer Null-Benutzer-Beziehung zu erstellen und zu speichern. Sie können dies umgehen, indem Sie Folgendes angeben:

belongs_to :user, :optional => true 

in Ihrem Comanda-Modell, aber das wird wahrscheinlich Ihr Geschäftsmodell brechen.

Der tatsächliche Fehler ist aufgrund der Tatsache, dass die erste Zeile (create c1) fehlgeschlagen, und wenn die Verarbeitung in die letzte Zeile (commandas < < ...), das C1-Objekt ist Null oder ungültig und dann das Update zu dem Benutzerobjekt schlägt fehl.

Hoffe, das hilft!

+0

EDIT: wie puneet18 die Antwort, offensichtlich, wenn die Benutzer_id-Spalte nicht in der Tabelle Comandas existiert, schlägt es bei der Aktualisierung. –

Verwandte Themen