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')
Другие вопросы по тегам