0

globalize3 gemのgithubページhttps://github.com/svenfuchs/globalize3には、複数の翻訳が必要な文字列属性とテキスト属性を使用してモデルの移行を準備する方法の概要が明確に示されています。例えば:

 class CreatePosts < ActiveRecord::Migration
   def up
     create_table :posts do |t|
     t.timestamps
   end
   Post.create_translation_table! :title => :string, :text => :text
 end
 def down
   drop_table :posts
   Post.drop_translation_table!
 end
 end

user_idやその他の整数値属性の保存など、変換を必要としない特定の属性がある場合はどうでしょうか。Post.create_translation_tableの一部として以下に記述しますか?宣言、または上記のcreate_table:posts部分に残しますか?

正しいEG:

 def up
    create_table :posts do |t|
      #put it here as t.integer :user_id?
    end
    Post.create_translation_table! :title => string, :text => :text #user_id dec here?
 end

ありがとう!

4

1 に答える 1

2

クイックアンサー:はい、翻訳されていない属性は他のactiverecordモデルの属性と同じように扱います。

create_table :posts do |t|
  t.integer :user_id
end

正しい。

実行しているのは、と呼ばれるのテーブルcreate_translation_tableを作成することです。このテーブルには、翻訳された属性の個々の翻訳が、特定の翻訳のロケールおよびテーブル内の親レコードのIDとともに格納されます。post_translationsposts

schema.rb移行を実行した後に見ると、2つのテーブルが表示されます。1つはuser_id(およびタイムスタンプは常に必要です):

create_table "posts", :force => true do |t|
  t.integer  "user_id"
  t.datetime "created_at",                 :null => false
  t.datetime "updated_at",                 :null => false
end

移行での呼び出しによって作成される、翻訳された属性の翻訳用の別のテーブルcreate_translation_table

create_table "post_translations", :force => true do |t|
  t.integer  "post_id"
  t.string   "locale"
  t.string   "title"
  # any other translated attributes would appear here
  t.datetime "created_at",  :null => false
  t.datetime "updated_at",  :null => false
end

なぜglobalize3が別のテーブルを作成するのかと疑問に思うかもしれません。それらを親レコードと同じテーブルに(たとえばtitle_entitle_esなどの形式で)配置しないのはなぜですか?これを行う他の翻訳宝石があります、例えばtraco。ただし、親レコードに翻訳を配置する場合は、各ロケールで属性の列を作成する必要があるため、サポートするロケールを事前に指定する必要があります。新しいロケールを追加する場合は、それらをサポートするためにデータベースを移行する必要があります。

一方、globalize3ソリューションでは、翻訳テーブル内の各翻訳済みレコードにロケールが添付されているため、サポートするロケールを事前に決定する必要はありません。どこにも「ハードコーディング」しません。サポートされているロケール。これはこの問題に対処するための非常にエレガントな方法であり、globalize3の人気の根底にありますが、属性がモデルにアタッチされているように見せるPostために宝石がいくつかのトリックを行う必要があるため、最初は少し混乱する可能性があります( )一方、実際には別のクラスにアタッチされていPost::Translationます。

とにかく、それはあなたが求めていた以上のものでしたが、知っておくと便利なことです。

于 2012-09-17T22:55:22.273 に答える