Rails 4迁移|添加带参考的表

时间:2015-08-15 04:51:06

标签: ruby-on-rails ruby associations rails-activerecord rails-migrations

我正在尝试在我的Rails 4项目中创建一个Collaboration表,但我遇到了一个问题。我希望它属于一个用户,即协作者。

我运行以下命令来生成模型和迁移,我也在下面复制过。

rails generate model Collaboration project:references collaborator:references accepted:boolean

迁移:

class CreateCollaborations < ActiveRecord::Migration
    def change
        create_table :collaborations do |t|
            t.references :project, index: true, foreign_key: true
            t.references :collaborator, index: true, foreign_key: true
            t.boolean :accepted

            t.timestamps null: false
        end
    end
end

型号:

class Collaboration < ActiveRecord::Base
    belongs_to :project
    belongs_to :collaborator, class_name: 'User'
end

我更新了协作模型以包含, class_name: 'User',如上所示。同样,我更新了现有的Strategy模型,以包含has_many :collaborations

class Project < ActiveRecord::Base
    has_many :collaborations
end

当我运行rake db:migrate时,我收到以下错误报告。

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "collaborators" does not exist
我真的有点疑惑,因为这种情况正在发生。 非常感谢任何帮助!谢谢。 :)

编辑:

也为我的User模型添加代码。

class User < ActiveRecord::Base
    authenticates_with_sorcery!

    has_many :projects
    has_many :collaborations
end

我为密码,电子邮件等字段编辑了验证,试图消除混乱。

4 个答案:

答案 0 :(得分:6)

迁移的这一部分:

t.references :collaborator, index: true, foreign_key: true

将尝试在数据库中创建foreign key,以便collaborator_id表的collaborations列保证为NULL或包含id } collaborators表中的一列。在collaborators表存在之前,您无法创建该FK。

您收到的错误是:

relation "collaborators" does not exist

那只是告诉你,你没有collaborators表,但是你试图引用它。

您需要迁移才能在创建collaborators表之前创建collaborations

答案 1 :(得分:1)

至少在Rails 5中,您可以使用foreign_key:{to_table:...}},如下所示。

create_table :messages, id: :uuid do |t|
  t.references :from_user, type: :uuid, index: true, null: false, foreign_key: {to_table: :users, on_delete: :cascade}
  t.references :to_user, type: :uuid, references: :user, index: true, null: false, foreign_key: {to_table: :users, on_delete: :cascade}
  t.text :body, null: false
  t.timestamps
end

答案 2 :(得分:1)

抱歉迟到了,但本质上都是为了方便,记住这就是 Rails 的本质。所以;每个引用都应针对应为复数形式的表(因为表包含许多“对象”),因此,您必须引用复数,以便 rails 生成对单数对象的引用。按钮行,您的迁移应该看起来更像;

class CreateCollaborations < ActiveRecord::Migration
  def change
    create_table :collaborations do |t|
        t.references :projects, index: true, foreign_key: true
        t.references :collaborators, index: true, foreign_key: true
        t.boolean :accepted

        t.timestamps null: false
    end
  end
end

现在,如果您遵循约定,那么其余部分应该没有问题,只需记住 belong_to 是单数对象,而 has_many 是复数对象。

>

PS:我不会为该列使用过去的参考,例如 accepted

快乐编码

答案 3 :(得分:0)

我假设您在开发数据库中。

首先尝试重置数据库:

rake db:reset

如果这不能解决问题,请尝试:

删除数据库,然后重新创建它,迁移数据:

rake db:drop 
rake db:create 
rake db:migrate 

如果你有种子,那么运行:

rake db:seed