我使用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工作?
欢呼声
答案 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
必须有更清洁的方式,但我缺乏创建拉取请求的经验。