2017-05-18 89 views
0

我在我的應用程序中添加了logIn的devise gem。我的頁面是一家商店和一個用戶有很多訂單,我在模型用戶添加:Ruby on Rails - rake db:seed aborted

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 

而且在Comandas(訂單)的遷移文件添加此:

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 

而且現在我m用種子文件測試數據庫,但是當我向用戶添加一個Comanda時,這引起了rake中止的錯誤。前

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

I'created用戶:

我的種子文件。

錯誤: Screen shot of shell

UPDATE:

我終於發現了問題。問題在於我在添加此修改之前創建了所有模型。當我添加這個關係時,Rails並沒有改變我的數據庫。我檢查了這個進入sqlite命令行並列出了Comandas表的列。我看到用戶的參考不在這裏。並決定放棄所有數據庫中執行以下命令:

rake db:drop db:create db:migrate 

後,我增加了一個用戶,我跑:

rake db:seed 

和作品! 感謝大家的幫助!

+0

你不想先創建用戶嗎? – ediblecode

+0

我已經創建了用戶,因爲當我執行rake db:種子沒有最後一行時,我將Comanda添加到用戶,它工作。 – Xavi

+0

刪除最後一行並不證明'u1'不爲空 – ediblecode

回答

0

添加user_idcomandas表中。

添加新的遷移添加user_id

rails g migration AddUserIdToCommando user_id:integer 
0

的Comanda模型沒有封閉,但我可以猜測這種現象的可能原因。

首先,什麼可能會工作,並與實際的基礎數據庫模型更兼容是:

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

用戶模型不知道的是孩子的外鍵,則Comandas表的「USER_ID」列。更直觀地看到Comanda模型負責保存自己的數據庫列。

但是我可以猜到,這是由於一個事實,即最近的Rails的版本執行默認belongs_to的關係,當你試圖做的事情 - 通過使用Comanda.create而不是

c1 = Comanda.create(total: 100) 

失敗,因爲Comanda.new,您試圖創建並保存具有零用戶關係的新Comanda對象。你可以通過指定:

belongs_to :user, :optional => true 

在你的Comanda模型,但這可能會打破你的商業模式。

實際錯誤是由於第一行(創建c1)失敗以及處理到達最後一行(命令爲< < ...)時,c1對象爲零或無效,然後更新到用戶對象失敗。

希望這會有所幫助!

+0

編輯:根據puneet18的答案,顯然如果user_id列在Comandas表中不存在,它會在更新時失敗。 –

相關問題