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
一定有更简洁的方法,但我缺乏创建拉取请求的经验。
我的 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
一定有更简洁的方法,但我缺乏创建拉取请求的经验。