Ruby 在 Rails 4.2 上使用 Globalize gem for UUID table

Ruby on Rails 4.2 with Globalize gem for UUID table

我的 rails 4.2 项目使用 Globalize gem,table 主 ID 是 postgre 中的 UUID。

这里是table迁移代码和创建的翻译table外键是整数类型,不是UUID。

class CreateMessageThreads < ActiveRecord::Migration
  def up

    enable_extension 'uuid-ossp'

    create_table :message_threads, id: :uuid do |t|
      t.integer :resource_id, null: false
      t.string :resource_type, null: false
      t.datetime :deleted_at

      t.timestamps null: false
    end

    MessageThread.create_translation_table!({
      :title => :string
    })

  end

  def down
    drop_table :message_threads
    MessageThread.drop_translation_table!
  end
end

有没有办法让这个 UUID 工作?

干杯

我刚遇到这个问题,我在 rails 4.1.8 和 globalize 4.0.2 中通过覆盖 globalize 方法并在我的迁移中使用默认方法调用解决了这个问题

Model.create_translation_table!({:name => :string}, {:migrate_data => true})

我创造了/lib/globalize_uuid.rb

  module Globalize
    module ActiveRecord
      module Migration
        class Migrator
          def create_translation_table
            connection.create_table(translations_table_name, id: :uuid) do |t|
              t.uuid table_name.sub(/^#{table_name_prefix}/, '').singularize + "_id", :null => false
              t.string :locale, :null => false
              t.timestamps
            end
          end
        end
      end
    end
  end

并更改我的 Rakefile 以在 load_tasks

之后加载扩展
Rails.application.load_tasks
require File.expand_path('../lib/globalize_uuid', __FILE__)

不确定,如果该解决方案在 globalize3 更新后仍然存在,但目前它有效。

我无法使用 Thomas Engelbrecht 提供的硬编码解决方案,因为并非我的所有模型都使用 uuid。

由于模型是委托的,我们可以通过添加一个方法来检查它的主键类型:

def primary_key_type
    column_type(model.primary_key).to_sym
end

我正在使用 Rails 4.2,所以我可以使用参考 type 选项 ( source )

module Globalize
  module ActiveRecord
    module Migration
      class Migrator
        def primary_key_type
          column_type(model.primary_key).to_sym
        end

        def create_translation_table
          connection.create_table(translations_table_name, id: primary_key_type) do |t|
            t.references table_name.sub(/^#{table_name_prefix}/, '').singularize, null: false, type: primary_key_type
            t.string :locale, null: false
            t.timestamps null: false
          end
        end
      end
    end
  end
end

一定有更简洁的方法,但我缺乏创建拉取请求的经验。