0

我将Globalize gem用于我的 rails 4.2 项目,表主 ID 是 postgre 中的 UUID。

这是表迁移代码和创建的转换表外键是整数类型,而不是 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 工作?

干杯

4

2 回答 2

0

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

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

def primary_key_type
    column_type(model.primary_key).to_sym
end

我正在使用 Rails 4.2,所以我可以使用引用类型选项(

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

必须有一种更清洁的方式,但我缺乏创建拉取请求的经验。

于 2015-03-25T14:38:13.077 回答
0

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

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 更新中幸存下来,但现在它可以工作。

于 2015-03-20T10:07:50.037 回答