Ransack поиск и переводы
Я пытаюсь заставить Ransack работать над моделью, которая связана с таблицей перевода.
Переводы осуществляются с помощью globalize gem.
Проблема в том, что когда я пытаюсь выполнить поиск с помощью Ransack в таблице моделей в столбце: name, он ничего не показывает, потому что информация: name хранится в другой таблице.
Какие-нибудь подсказки, как я могу сделать поиск ранчо в таблице трансляции ассоциации? Я знаю, что есть возможность использовать Ransackers, но я понятия не имею, какой код добавить в них.
2 ответа
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" })
Хотя @rlarcombe его ответ работает в этой конкретной ситуации, вы теряете все предикаты, которые предоставляет Ransack (например, продолжение и т. Д.), И в основном сами пишете поисковый запрос.
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')