Ruby on Rails - rake db:种子中止

时间:2017-05-18 10:08:04

标签: ruby-on-rails ruby database ruby-on-rails-4 rake

我在我的应用程序中添加了logIn的设计宝石。我的页面是一个商店,一个用户有很多订单,我添加模型用户:

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

现在我正在使用种子文件测试数据库但是当我向用户添加一个Comanda时,这会引起rake中止的错误。

我的种子档案:

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

我之前创建了用户。

错误: Screen shot of shell

更新

我终于找到了问题。问题是我在添加此修改之前创建了所有模型。当我添加这种关系时,Rails没有改变我的数据库。我检查了这个进入sqlite命令行并列出了Comandas表的列。我看到用户的引用不在这里。并决定删除执行此命令的所有数据库:

rake db:drop db:create db:migrate

我添加了一个用户并运行后:

rake db:seed 

并且有效! 感谢大家的帮助!

2 个答案:

答案 0 :(得分:0)

user_id表中添加comandas

添加新迁移以添加user_id

rails g migration AddUserIdToCommando user_id:integer

答案 1 :(得分:0)

Comanda模型没有附上,但我可以猜出这种行为的可能原因。

首先,可能会起作用,并且与实际的基础数据库模型更兼容的是:

c1 = Comanda.new(total: 100)
u1 = User.find_by email: "aaa@aaa.cat"
c1.user_id = u1.id
c1.save!

用户模型不知道它的孩子的外键,Comandas表的用户名&#39;柱。可以更直观地看到Comanda模型负责保存自己的数据库列。

但我可以猜测,由于最近版本的Rails默认强制执行belongs_to关系,当你尝试这样做时 -

c1 = Comanda.create(total: 100)

它失败了,因为通过使用Comanda.create而不是Comanda.new,您尝试使用nil用户关系创建和保存新的Comanda对象。您可以通过指定:

来克服这个问题
belongs_to :user, :optional => true

在您的Comanda模型中,但这可能会破坏您的商业模式。

实际错误是由于第一行(创建c1)失败,并且当处理到达最后一行(commandas&lt;&lt; ...)时,c1对象为nil或无效,然后是更新到用户对象失败。

希望这有帮助!