我正在尝试在与翻译表关联的模型上进行搜查。
翻译由 globalize gem 管理。
问题是当我尝试在 :name 列的模型表中搜索 ransack 时,它什么也没有显示,因为 :name 信息存储在另一个表中。
任何线索如何在关联翻译表中进行搜查?我知道有可能使用洗劫者,但我不知道要在其中放入哪些代码。
我正在尝试在与翻译表关联的模型上进行搜查。
翻译由 globalize gem 管理。
问题是当我尝试在 :name 列的模型表中搜索 ransack 时,它什么也没有显示,因为 :name 信息存储在另一个表中。
任何线索如何在关联翻译表中进行搜查?我知道有可能使用洗劫者,但我不知道要在其中放入哪些代码。
虽然@rlarcombe 他的答案在这种特定情况下有效,但您放弃了 ransack 提供的所有谓词(eq、cont 等)并且基本上是自己编写搜索查询。
Globalize 将转换表添加为关联,ransack 提供了通过在可搜索属性前加上关联表名称来搜索关联表的能力。
对于您的情况,这将起作用,并且仍然允许您使用所有 ransack 的谓词。
User.with_translations(I18n.locale).ransack(translations_name_eq: 'John')
您可以通过仅替换谓词后缀来使用其他谓词(例如cont
(包含))进行匹配:ILIKE
User.with_translations(I18n.locale).ransack(translations_name_cont: 'John')
Globalize 为您提供了一个with_translations的类方法,例如:
User.with_translations('en')
因此,您可以在模型上设置自己的范围,利用这一点:
def self.with_translated_name(name_string)
with_translations(I18n.locale).where('user_translations.name' => name_string)
end
然后,您可以在相关模型的 ransackable_scopes 数组中公开此范围,例如:
private
def self.ransackable_scopes
%i(with_translated_name)
end
有了这个,你应该能够做到:
User.ransack({ with_translated_name: "John" })