モデルの多言語化については、RailsガイドでGemが紹介されているのでそれらのGemについて軽くまとめてみました。
traco
- locale毎にカラムを用意するシンプルな方式(例:
title_sv
、title_en
) - localeが増える毎にマイグレーション(カラム追加)が必要になるので複数言語対応する可能性があるなら厳しいが、英語しか対応しないなど固定で決まっているならこれでも良いかも
- 使用されてなくても全てのレコードに全てのlocale分のカラムが存在する(NULLで)のでスペースの使用効率は悪い
globalize
- 一番メジャー
- 多言語化したいカラムが存在するテーブル毎に
_translations
という別テーブルを作成する方式 - locale毎にレコードができる(localeカラムを持っている)
id | post_id | locale | title | name |
---|---|---|---|---|
1 | 1 | ja | タイトル | 名前 |
2 | 1 | en | title | name |
- 必要なlocaleの分だけレコードが作られるのでスペースの使用効率が良い
- 毎回joinする必要あるのでクエリが少し複雑になる
mobility
globalize
のコアコミッターでRubyKaigiでも発表されていたshioyamaさんがもっといいソリューションをと作ったもの- 基本何でもできる
- カラム方式
- tracoのような
- 別テーブル方式
- globalizeのような
- 共有別テーブル方式(default)
- これがmobility独自の方式で売りっぽい
- globalizeはそれぞれテーブルを持っていたが、これは一つのテーブルに全てのモデルのデータが入る(ポリモーフィック関連)
- シリアライズ方式
- Hstore/Jsonb方式(PostgreSQLオンリー)
- カラム方式
- mobilityを作った背景などが書かれているブログ(多言語化に対する解決法がまとまっていてかなり参考になる)