搜索和翻译

Ransack search and translations

我正在尝试对与翻译相关联的模型进行搜查 table。

翻译由 globalize gem 管理。

问题是当我尝试在模型 table 的 :name 列中搜索搜索时,它什么也没显示,因为 :name 信息存储在另一个 table.

有什么线索可以在协会翻译中进行搜查吗table?我知道有可能使用掠夺者,但我不知道应该在其中输入什么代码。

Globalize 为您提供 with_translations 的 class 方法,例如:

User.with_translations('en')

因此您可以在您的模型上设置自己的范围,利用它,例如:

def self.with_translated_name(name_string)
  with_translations(I18n.locale).where('user_translations.name' => name_string)
end

然后您可以在相关模型中公开此 scope in your ransackable_scopes array,例如:

private

def self.ransackable_scopes   
  %i(with_translated_name) 
end

有了这些,您应该能够做到:

User.ransack({ with_translated_name: "John" }) 

虽然@rlarcombe 他的回答在这种特定情况下有效,但您放弃了 ransack 提供的所有谓词(eq、cont 等),基本上是自己编写搜索查询。

Globalize 将翻译 table 添加为关联,并且 ransack 通过在可搜索属性前加上关联的 table 名称提供搜索关联 table 的能力。

对于你的情况,这会起作用,并且仍然允许你使用所有的 ransack 谓词。

User.with_translations(I18n.locale).ransack(translations_name_eq: 'John')

您可以使用 cont(包含)等其他谓词进行 ILIKE 匹配,只需替换谓词后缀:

User.with_translations(I18n.locale).ransack(translations_name_cont: 'John')