2017-02-01 4 views
1

У меня есть отношение HABTM между моделями Theme и Quote. В окне themesindex отображается количество котировок, связанных с каждой темой. Я бы хотел добавить Ransack sort_link в эту колонку, так что themes можно сортировать по их числу связанных quotes.Ransack сортировать по количеству записей HABTM или HMT

Я успешно это сделал с ассоциациями has_many, использующими столбец кеша-счетчика, но Rails не поддерживает столбцы счетчика кеша для ассоциаций HABTM.

До сих пор у меня есть объем, который добавляет виртуальный атрибут quotes_count (путем выполнения одного запроса, избегая N + 1) в Theme модели:

scope :with_quotes_count, -> do 
    joins('LEFT OUTER JOIN quotes_themes on quotes_themes.theme_id = themes.id') 
    .select('themes.*, COUNT(quotes_themes.quote_id) as quotes_count') 
    .group('themes.id') 
end 

Кажется, что я должен преобразовать вышеупомянутый объем в «Ransacker» с использованием ARel, но до сих пор все мои попытки потерпели неудачу.

Я использую Rails 4.2.2, ARel 6.0.4 и PostgreSQL 9.5.4.

Любая помощь будет принята с благодарностью.

+0

Я не уверен, что вы можете сортировать сортировку с областями. Я всегда делал это с обертками Ареля. – Sash

ответ

3

Учитывая вы ваши лица запрашиваются с помощью указанных выше сфер, например, ваш индекс запроса всегда:

# controller 
@search = Theme.ransack(params[:q]) 
@themes = @search.result(distinct: true).with_quotes_count 

у попробовать из:

# model 
ransacker :quotes_count_sort do 
    Arel.sql('quotes_count') 
end 

И использовать имя из рода в sort_link?

+0

Так просто, но он отлично работает. Спасибо! – BrunoFacca

+0

Удивительный, не возражаете ли вы принять его в качестве ответа, пожалуйста? :) – Sash

+0

Конечно! Если вы заинтересованы, у меня также есть [это] (http://stackoverflow.com/questions/42029562/activerecord-error-when-trying-to-order-results-from-a-scope/42031400?noredirect=1 # comment71317696_42031400) вопрос вы можете знать ответ. – BrunoFacca

0

есть некоторый патч, который может быть полезным для вас использовать прицел посещение https://gist.github.com/ledermann/4135215

+0

Спасибо за ваш ответ. Этот патч был написан 4 года назад. Ransack [в настоящее время поддерживает области применения] (https://github.com/activerecord-hackery/ransack#using-scopesclass-methods). Дело в том, что до сих пор я не мог написать область действия, которая работает так, как описано в этом вопросе. – BrunoFacca

Смежные вопросы