0

私は Rails 4.2 プロジェクトにGlobalize gemを使用しており、テーブルのプライマリ 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

この問題が発生したばかりで、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

load_tasks の後に拡張機能をロードするように Rakefile を変更しました

Rails.application.load_tasks
require File.expand_path('../lib/globalize_uuid', __FILE__)

その解決策が globalize3 の更新に耐えられるかどうかはわかりませんが、今のところ機能しています。

于 2015-03-20T10:07:50.037 に答える
0

すべてのモデルが uuid を使用しているわけではないため、Thomas Engelbrecht が提供するハードコーディングされたソリューションを使用できませんでした。

モデルは委譲されているため、メソッドを追加して主キーのタイプを確認できます。

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

よりクリーンな方法があるはずですが、プル リクエストを作成する経験がありません。

于 2015-03-25T14:38:13.077 に答える