在迁移时,我收到以下错误消息:
PG::UndefinedTable: ERROR: relation "actioncodes" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_4ecaa2493e"
FOREIGN KEY ("actioncode_id")
REFERENCES "actioncodes" ("id")
我有以下组织的迁移文件:
class CreateOrganizations < ActiveRecord::Migration
def change
create_table :organizations do |t|
t.string :name, null: false, limit: 40
t.references :actioncode, index: true, foreign_key: true
t.boolean :activated
t.datetime :activated_at
t.timestamps null: false
end
end
end
对于Actioncodes,我有迁移文件:
class CreateActioncodes < ActiveRecord::Migration
def change
create_table :actioncodes do |t|
t.string :code, null: false, limit: 20
t.string :description, limit: 255
t.timestamps null: false
end
end
end
class AddIndexToActioncodesCode < ActiveRecord::Migration
def change
add_index :actioncodes, :code, unique: true
end
end
组织模型文件包括:belongs_to :actioncode
。
动作代码模型文件包括:has_many :organizations
。
知道可能导致错误消息的原因是什么吗?
如果我从迁移文件中删除index: true, foreign_key: true
,它会毫无错误地迁移。当我用不正确的行t.references :actioncode_id, index: true, foreign_key: true
替换该行时,它会给出下面的错误,其中最后一行(&#34; ids&#34;)表明Rails似乎在某种程度上对表的名称有问题?
PG::UndefinedTable: ERROR: relation "actioncode_ids" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_604f95d1a1"
FOREIGN KEY ("actioncode_id_id")
REFERENCES "actioncode_ids" ("id")
答案 0 :(得分:15)
因此,问题正在发生,因为在CreateOrganizations
执行之前正在运行CreateActioncodes
迁移。
CreateActioncodes
,从而确保action codes
表存在。
运行迁移的顺序基于迁移的时间戳 - 如文件名中所示。 20141014183645_create_users.rb
将在20141014205756_add_index_to_users_email.rb
之前运行,因为第二个的时间戳 - 20141014205756
在第一个的时间戳之后 - 20141014183645
。
确保CreateOrganizations
迁移的时间戳记在CreateActioncodes
迁移的时间戳之后。
您可以手动更改文件名中的时间戳。或删除这些迁移文件,并按正确的顺序创建它们。
答案 1 :(得分:10)
此行中的foreign_key: true
:
t.references :actioncode, index: true, foreign_key: true
告诉Rails在数据库中创建一个外键。一个foreign key:
约束指定列(或一组列)中的值必须与另一个表的某行中出现的值匹配。我们说这维护了两个相关表之间的参照完整性。
因此,它是数据库中的一些逻辑(它所属的位置),可确保您无法在actioncode
列中放置无效值,并且无法从actioncodes
表中删除条目正在其他地方使用。
为了创建约束,引用的表(actioncodes
)在引用之前需要存在。看起来您的迁移尝试在organizations
之前创建actioncodes
,因此您需要做的就是重命名CreateOrganizations
迁移文件,使其时间戳前缀位于CreateActioncodes
的前缀之后。前缀只是格式为YYYYMMDDhhmmss的时间戳,因此将CreateOrganizations
时间戳更改为CreateActioncodes
时间戳再多一秒。
答案 2 :(得分:4)
我也遇到了这个错误。如果您使用测试数据库运行rspec,请确保在运行rspec之前在终端中运行rake db:test:prepare
。
答案 3 :(得分:0)
在Ubuntu 20.04中使用Rails 6应用程序时,我也遇到了同样的挑战。
我正在大学门户网站上工作,我有一个名为School
和另一个名为Program
的模型。模型Program
属于模型School
,因此需要在school
表中添加一个programs
引用列。
我使用此命令创建了迁移文件:
rails generate model School name:string logo:json motto:text address:text
rails generate model Program name:string logo:json motto:text school_id:references
但是,当我运行命令时:rails db:migrate
我遇到了错误:
== 20201208043945 CreateSchools: migrating ====================================
-- create_table(:schools)
-> 0.0140s
== 20201208043945 CreateSchools: migrated (0.0141s) ===========================
== 20201208043958 CreatePrograms: migrating ===================================
-- create_table(:programs)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UndefinedTable: ERROR: relation "school_ids" does not exist
这是我的解决方法:
问题出在以下命令:
rails generate model Program name:string logo:json motto:text school_id:references
应该是school:references
而不是school_id:references
,所以在迁移期间Rails无法找到表school_ids
。
因此我将命令修改为:
rails generate model Program name:string logo:json motto:text school:references
效果很好。
仅此而已。
我希望这会有所帮助