Techioz Blog

Rails + globalize - 翻訳の自動読み込みを無効にする

概要

これらの宝石を含むアプリがあります:

レール 5.2.8.1

グローバル化 6.2.1

グローバル化アクセサー 0.3.0

アクセサー/翻訳された列を呼び出していないにもかかわらず、翻訳は常に自動ロードされているようです。例えば:

Model.where(id:123)
Model Load (3.0ms)  SELECT  "model"."id", "model"."column1", "model"."created_at", "model"."updated_at" FROM "model" WHERE "model"."id" = $1 LIMIT $2  [["id", 123], ["LIMIT", 11]]
Model::Translation Load (0.5ms)  SELECT "model_translations".* FROM "model_translations" WHERE "model_translations"."model_id" = $1  [["model_id", 123]]

なぜ翻訳が自動的に読み込まれるのですか?これを無効にするにはどうすればよいですか?私も試してみました:

Model.where(id:123).select(:id)
Model Load (0.7ms)  SELECT  "model"."id" FROM "model" WHERE "model"."id" = $1 LIMIT $2  [["id", 123], ["LIMIT", 11]]
Model::Translation Load (0.4ms)  SELECT "model_translations".* FROM "model_translations" WHERE "model_translations"."model_id" = $1  [["model_id", 123]]

変換テーブルで SELECT を呼び出さないようにする方法はありますか?ありがとう

解決策

はい、翻訳が自動ロードされないようにする方法があります。これを行うには、モデルで globalize_load_translations オプションを false に設定します。例えば:

class Model < ApplicationRecord
  globalize_load_translations false
end

これにより、Model.find(123) を呼び出したときに翻訳がロードされなくなります。ただし、翻訳にアクセスする必要がある場合は、モデル インスタンスで translations メソッドを呼び出すことでアクセスできます。例えば:

model = Model.find(123)
translations = model.translations

これにより、実際に必要な場合にのみ翻訳がロードされます。

Rails アプリケーション構成ファイルで config.globalize.load_translations オプションを false に設定することで、翻訳の自動ロードをグローバルに無効にすることもできます。例えば:

config.globalize.load_translations = false

これにより、アプリケーション内のすべてのモデルの翻訳の自動ロードが無効になります。