Rails使用uuids迁移create_join_table

时间:2015-10-02 16:19:09

标签: ruby-on-rails rails-activerecord

较新版本的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

3 个答案:

答案 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类型添加额外支持,那将是很好的,甚至可以通过现有的迁移来推断。

在此之前,希望这些步骤能够达到同样的效果。