Ruby on Rails 4.2,带有用于UUID表的Globalize gem

时间:2015-03-11 11:34:06

标签: ruby-on-rails postgresql gem uuid globalize

我使用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工作?

欢呼声

2 个答案:

答案 0 :(得分: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更新中存活,但现在可以正常工作。

答案 1 :(得分:0)

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

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

def primary_key_type
    column_type(model.primary_key).to_sym
end

我正在使用Rails 4.2,因此我可以使用参考类型选项(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

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