作为将rails应用程序升级到rails 4的一部分,我执行了命令rake db:migrate
,因为我使用了id为(supply_ref_id)的列名,所以它被归档了。我知道rails会引用父表,因为我在后缀中使用了_id
。但是,它正在使用rails< 4应用程序。
任何使其有效的建议。 THX。
PG::UndefinedTable: ERROR: relation "supply_refs" does not exist
...
...
CONSTRAINT fk_users_supply_ref_id FOREIGN KEY ("supply_ref_id")
REFERENCES "supply_refs" ("id")) /usr/local/rvm/gems/ruby-2.1.2@demo/gems/activerecord-4.1.9/lib/active_record/connection_adapters/postgresql/
database_statements.rb:128:in `async_exec'
答案 0 :(得分:1)
除非您定义关联,例如belongs_to: supply_ref
,否则Rails不关心“外键”列名称的“_id”后缀。甚至可以将此关联配置为使用“外键”列的另一个名称,如“_id”约定所暗示的那样。
我已经快速实施了您的示例并且没有任何错误:
class CreateFoos < ActiveRecord::Migration
def change
create_table :foos do |t|
t.string :name
t.string :type
t.integer :supply_ref_id
t.timestamps
end
end
end
Foo.create(name: 'foo', supply_ref_id: 4711)
=> #<Foo id: 1, name: "foo", type: nil, supply_ref_id: 4711, created_at: "2015-02-12 09:11:01", updated_at: "2015-02-12 09:11:01">
实际上说的错误是,在postgres数据库中定义了一些FOREIGN KEY CONSTRAINT(或者rails试图定义它)。它引用了不存在的supply_refs
表。
Rails实际上没有默认定义外键约束。见3.6 Foreign Keys。因此,他们要么在迁移中定义,要么在其他一些3d派对中定义,例如foreigner
。
如果您没有supply_refs
表,则应删除此外键定义。
答案 1 :(得分:0)
确保您的依赖关系树中没有schema_plus。
如果是这样,这可以解决您的问题。
class CreateFoos < ActiveRecord::Migration
def change
create_table :foos do |t|
t.string :name
t.string :type
t.integer :supply_ref_id, foreign_key: false
t.timestamps
end
end
end