2017-05-18 1 views
0

私はlogIn用のdevise gemを私のアプリに追加しました。マイページでは、お店で、一人のユーザーは、多くの注文を持っていると私は、モデルのユーザーに追加します。Ruby on Rails - rake db:seed aborted

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 

そして今、私は」:私はこれを追加

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(受注)の移行ファイルにシードファイルでDBをテストしていますが、ユーザにComandaを追加すると、レーキが打ち切られるというエラーが発生します。

マイシーズファイル:

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:seedを最後の行なしで実行すると、私はすでにユーザーを作成しています。ここでComandaをUserに追加すると動作します。 – Xavi

+0

最後の行を削除しても、 'u1'がヌルではないことが証明されていません。 – ediblecode

答えて

0

comandasuser_idを追加します。

は、新たな移行がuser_idを追加します:

rails g migration AddUserIdToCommando user_id:integer 
0

Comandaモデルが同封されていませんが、私はこの動作の考えられる理由を推測することができます。おそらく動作し、実際の基礎となるDBモデルとの互換性がどうなるかをまず

は、次のとおりです。

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

Userモデルは、それが子の外部キー、Comandasテーブルの「user_idの」列だとは考えていません。 Comandaモデルが独自のdbカラムを保存するのは、直感的です。

私が推測することができますが、その原因あなたがしようとしたときのRailsの最近のバージョンは、デフォルトではbelongs_toの関係を強化するという事実に - というよりも、Comanda.createを使用して

c1 = Comanda.create(total: 100) 

それが失敗し、以来、 Comanda.new、新しいComandaオブジェクトを作成し、nil User関係で保存しようとしています。あなたはComandaモデルで

belongs_to :user, :optional => true 

を指定することでこれを克服できますが、これはおそらくビジネスモデルを破ります。

実際のエラーは、最初の行(create c1)が失敗し、処理が最後の行(commandas < < ...)に達したために、c1オブジェクトはnilまたは無効であり、ユーザーオブジェクトへのアクセスが失敗します。

希望すると便利です。

+0

EDIT:puneet18の答えによると、明らかにuser_id列がComandas表に存在しない場合、更新時に失敗します。 –

関連する問題