在 rails 迁移中添加对非整数列的引用
Adding a reference to a non-integer column in rails migration
我今天研究了几个关于这个话题的问题。我知道,我可以在迁移中使用 t.references
来添加引用。但是,如果 table 具有非整数主键,我该如何添加对该列的引用?
我有一个table这个定义
create_table :sessions, id: false do |t|
t.string :session, primary_key: true, limit: 10
t.timestamps null: false
end
如何添加对 session
列的引用(名称在这里无关紧要),它是来自另一个 table 迁移的字符串。我用 t.references
进行了测试,但只是添加了一个整数列。我知道我可以使用 add column
。但是如果不直接使用 create_table
方法怎么办呢?
对重复标志的澄清
这个问题被标记为 this question 的重复,但实际上不是。因为我不是在询问使用非默认非整数主键设置 table,因为我已经设置了那个 table。我问的是从另一个 table 引用这种类型的 table。
您需要使用字符串类型,而不是使用引用助手,并添加索引以加快查找速度。如果您的其他型号是 "Record":
rails generate migration AddSessionIdToRecords session:string:index
应该像这样生成迁移:
def change
add_column :records, :session_id, :string
add_index :records, :session_id
end
由于您使用的是非常规命名,因此您需要指定模型中的主键和关系定义:
class Session < ActiveRecord::Base
self.primary_key = "session"
has_many :records, primary_key: "session"
end
class Record < ActiveRecord::Base
belongs_to :session, primary_key: "session"
end
我得出的结论是,如果不使用 rails 4.2 中引入的 foreign_key
,我无法真正引用另一列,只能按照 [=17 的建议创建索引=].
从rails 4.2开始,我可以像这样使用外键
会话中Table迁移
create table :sessions, id: false do |t|
t.string "session", primary_key: true
t.timestamp null: false
end
一条记录table引用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:
选项修复了引用的 table 的主键,即这里 session
。
实际上,您不必在 class 会话和记录
中添加 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
仅此而已。
自 rails 版本 4.2.7
您可以在 add_reference
助手中指定 type
。
假设你有 table records
并且你想在 records
中引用 sessions
。然后您可以执行以下操作:
add_reference :records, :sessions, type: :string, foreign_key: {to_table: :sessions, primary_key: :session}
我今天研究了几个关于这个话题的问题。我知道,我可以在迁移中使用 t.references
来添加引用。但是,如果 table 具有非整数主键,我该如何添加对该列的引用?
我有一个table这个定义
create_table :sessions, id: false do |t|
t.string :session, primary_key: true, limit: 10
t.timestamps null: false
end
如何添加对 session
列的引用(名称在这里无关紧要),它是来自另一个 table 迁移的字符串。我用 t.references
进行了测试,但只是添加了一个整数列。我知道我可以使用 add column
。但是如果不直接使用 create_table
方法怎么办呢?
对重复标志的澄清
这个问题被标记为 this question 的重复,但实际上不是。因为我不是在询问使用非默认非整数主键设置 table,因为我已经设置了那个 table。我问的是从另一个 table 引用这种类型的 table。
您需要使用字符串类型,而不是使用引用助手,并添加索引以加快查找速度。如果您的其他型号是 "Record":
rails generate migration AddSessionIdToRecords session:string:index
应该像这样生成迁移:
def change
add_column :records, :session_id, :string
add_index :records, :session_id
end
由于您使用的是非常规命名,因此您需要指定模型中的主键和关系定义:
class Session < ActiveRecord::Base
self.primary_key = "session"
has_many :records, primary_key: "session"
end
class Record < ActiveRecord::Base
belongs_to :session, primary_key: "session"
end
我得出的结论是,如果不使用 rails 4.2 中引入的 foreign_key
,我无法真正引用另一列,只能按照 [=17 的建议创建索引=].
从rails 4.2开始,我可以像这样使用外键
会话中Table迁移
create table :sessions, id: false do |t|
t.string "session", primary_key: true
t.timestamp null: false
end
一条记录table引用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:
选项修复了引用的 table 的主键,即这里 session
。
实际上,您不必在 class 会话和记录
中添加 primary_keydef 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
仅此而已。
自 rails 版本 4.2.7
您可以在 add_reference
助手中指定 type
。
假设你有 table records
并且你想在 records
中引用 sessions
。然后您可以执行以下操作:
add_reference :records, :sessions, type: :string, foreign_key: {to_table: :sessions, primary_key: :session}