较新版本的rails允许您指定应使用uuid主键创建表,如下所示:
create_table :foos, id: :uuid do |t|
# ...
end
哪个好。很长一段时间,rails支持创建连接表,如下所示:
create_join_table :foos, :bars do |t|
# ...
end
也很棒。除了我的表有uuid主键,并生成整数类型的外键列而不是类型uuid。
查看the documentation for create_join_table
,我找不到任何明显的更改列类型。是否可以将create_join_table
与uuids一起使用?
或者我是否手动创建了连接表:
create_table :bars_foos, id: false do |t|
t.uuid :bar_id
t.uuid :foo_id
end
答案 0 :(得分:7)
在Rails 5.0
中,您可以在column_options
方法上使用其他选项create_join_table
来指定您的ID列的类型。您的迁移将如下所示:
create_join_table :foos, :bars, column_options: {type: :uuid} do |t|
t.index [:foo_id, :baar_id]
end
答案 1 :(得分:5)
我应该查看代码......
def create_join_table(table_1, table_2, options = {})
join_table_name = find_join_table_name(table_1, table_2, options)
column_options = options.delete(:column_options) || {}
column_options.reverse_merge!(null: false)
t1_column, t2_column = [table_1, table_2].map{ |t| t.to_s.singularize.foreign_key }
create_table(join_table_name, options.merge!(id: false)) do |td|
td.integer t1_column, column_options
td.integer t2_column, column_options
yield td if block_given?
end
end
列显式创建为整数,无法更改它们。太糟糕了......
答案 2 :(得分:1)
无法使用uuids创建连接表。
正如问题create_table
中指出的那样,唯一的选择。使用uuid模拟create_join_tables
的最佳方法是使用create_tables
,如下所示:
rails g migration CreateFoosBars bars:references foos:references
生成输出
class CreateBarFoos < ActiveRecord::Migration
def change
create_table :bars_foos, id: :uuid do |t|
t.references :bars, foreign_key: true
t.references :foo, foreign_key: true
end
end
end
id: uuid
=&gt; id: false
type: uuid, index: true
添加到参考文献最终迁移
class CreateBarFoos < ActiveRecord::Migration
def change
create_table :bars_foos, id: false do |t|
t.references :bars, foreign_key: true, type: :uuid, index: true
t.references :foo, foreign_key: true, type: :uuid, index: true
end
end
end
如果Rails可以在create_join_table
中为不同的id类型添加额外支持,那将是很好的,甚至可以通过现有的迁移来推断。
在此之前,希望这些步骤能够达到同样的效果。