在rails4中使用没有父表的_id创建列名后缀

时间:2015-02-12 07:27:31

标签: ruby-on-rails-4 rails-migrations

作为将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'

2 个答案:

答案 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