在rails migration

时间:2015-08-23 15:11:27

标签: ruby-on-rails rails-migrations

我今天已就此主题研究了几个问题。我知道,我可以在迁移中使用t.references来添加引用。但是,如果表具有非整数主键,如何添加对该列的引用?

我有一个包含此定义的表

    create_table :sessions, id: false do |t|
      t.string  :session, primary_key: true, limit: 10  

      t.timestamps null: false
    end

如何添加对session列的引用(此处名称无关紧要),这是另一个表迁移的字符串。我使用t.references进行了测试,但只添加了一个整数列。我知道我可以使用add column。但是如果不直接从create_table方法做到这一点呢?

重复标记的澄清
此问题被标记为this question的重复,但实际上并非如此。因为我不是要求用非默认的非整数主键设置表,因为我已经设置了该表。我问的是从另一个表中引用这种类型的表。

3 个答案:

答案 0 :(得分:1)

实际上,您不必在类Session和amp;中添加primary_key。记录

def change
  add_column :records, :session_id, :string
  add_index :records, :session_id
  add_foreign_key :records, :sessions, column: :session_id, primary_key: "your_primary_key_name_in_sessions_table"
end

这就是全部。

答案 1 :(得分:1)

由于Rails版本4.2.7,您可以在type帮助器中指定add_reference。 假设您有表records,并且您想在sessions中引用records。然后,您可以执行以下操作:

add_reference :records, :sessions, type: :string, foreign_key: {to_table: :sessions, primary_key: :session}

答案 2 :(得分:0)

我得出的结论是,如果不使用rails 4.2中引入的foreign_key,我就无法真正引用另一列,只能按照this answer from eirikir的建议创建索引。

从rails 4.2,我可以使用这样的外键

在会话表迁移中

create table :sessions, id: false do |t|
  t.string "session", primary_key: true
  t.timestamp null: false
end

用于引用session主键

的记录表
create table :records do |t|
  t.string "session", null: false
  ..
  .. # other attributes
end

add_index :records, :session
add_foreign_key :records, :sessions, column: :session, primary_key: :session

这里,column:选项修复了我想要创建外键的列和primary_key:选项修复,引用表的主键,在这里session