我正在尝试在我的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
我为密码,电子邮件等字段编辑了验证,试图消除混乱。
答案 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