我今天已就此主题研究了几个问题。我知道,我可以在迁移中使用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的重复,但实际上并非如此。因为我不是要求用非默认的非整数主键设置表,因为我已经设置了该表。我问的是从另一个表中引用这种类型的表。
答案 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
。