Используйте Ransack sort_link для поиска неатрибутов
-
12-12-2019 - |
Вопрос
Я использую Ransack's sort_link в моем проекте rails, чтобы отобразить список сборов за мой оплата модель.Однако 'fee_amount' не является атрибутом оплата модель, но вместо этого классовый метод из законопроект модель (которая относится к оплате).То, что у меня есть в настоящее время, это:
<%= sort_link @search, :bill_fee_amount, "Плата за удобство" %>
который должен получить доступ к законопроект из текущего оплата и вызовите метод 'fee_amount' для этого законопроект, который выполняет некоторые вычисления и возвращает значение с плавающей точкой.Именно по этим поплавкам я надеюсь провести поиск.
Можно ли это сделать, или я могу сортировать только по атрибутам модели, с которой имею дело?
Решение
Ransack является преемником MetaSearch, и, согласно документации MetaSearch, вы можете создавать пользовательские поисковые запросы.Вот ссылка:
https://github.com/ernie/meta_search
Я думаю, что что-то подобное сработало бы:
scope :sort_by_bill_fee_amount_asc, joins(:bill).select('sum("bills"."fee_amount") AS bill_fee_amount').order('bill_fee_amount ASC')
scope :sort_by_bill_fee_amount_desc, joins(:bill).select('sum("bills"."fee_amount") AS bill_fee_amount').order('bill_fee_amount DESC')
В вопросе не было ясно, что именно представляет собой вычисление, поэтому я предположил, что это просто сумма поля с именем fee_amount
.К сожалению, это, вероятно, намного хуже, чем это, и я думаю, что неприятные вычисления SQL должны быть включены в Payment
модель.
Ключевым моментом, я думаю, является то, что SQL должен включать столбец, по которому вы сортируете, поэтому вам нужно, чтобы SQL вычислил его и включил с именем, по которому Ransack хочет выполнить поиск.
Я надеюсь, что это поможет.
Другие советы
Вы не можете с RANSACK, так как он приходит, но проверьте Эта проблема .Кажется, некоторые люди сделали патчи для этой функциональности, но я их не пробовал.
ransack , внутренне, он всегда использует модель, как определено в базе данных, и я не могЗаставьте его использовать временные таблицы, созданные принципами.
pd: переработал комментарий как ответ, как я всегда возвращаюсь к этому вопросу: P