Rails & Ransack-сортировка/поиск на основе определения в модели
скажем, например, у меня есть с start_date
и length
(как целое число дней).
в модели я определяю end_date
as start_date + length.days
очень просто, как и следовало ожидать:
def end_date
start_date + length.days
end
все прекрасно работает в шаблоне, я могу использовать event.end_date
для отображения даты начала плюс, сколько дней длина была установлена,, я хочу теперь заказать события к дате окончания с помощью Ransack.
ссылка сортировки для start_date
выглядит так: <%= sort_link @q, :start_date, "Start" %>
если я попробую то же самое для конечная_дата (<%= sort_link @q, :end_date, "End" %>
) он, к сожалению, молча терпит неудачу, поскольку я предполагаю, что он ищет end_date
как столбец в таблице, и не находя его.
я просто глупо или я пытаюсь сделать что-то, что Ransack просто не было сделано?
1 ответов
просто для тех, кто хочет посмотреть, как я это сделал:
в модели, где я определил конечная_дата
def end_date
start_date + length.days
end
затем я добавил метод "ranksacker" для: end_date
ransacker :end_date do |r|
Arel::Nodes::SqlLiteral.new("DATE_ADD(`events`.`start_date`, INTERVAL `events`.`length` DAY)")
end
Я честно не знаю, является ли это лучшим/правильным способом сделать вышеуказанное предложение, но я гораздо лучше знаком с SQL, чем с Ruby/Rails, поэтому он работал для меня, будучи настолько открытым.
что это эффективно делает, это создать кусок SQL, который заказывает запрос по тому же определение конечная_дата (начальная_дата + длина)
теперь я могу в шаблоне использовать следующий код для ссылки сортировки (что позволяет Ransacker обрабатывать ASC / DESC и не вмешиваться в wil_paginate и т. д.):
<%= sort_link @q, :end_date, "Event End Date" %>
когда вы нажмете эту ссылку, вы получите запрос по строкам:
SELECT DISTINCT events.* FROM events ORDER BY DATE_ADD(events.start_date, INTERVAL events.length DAY) DESC LIMIT 30 OFFSET 0
- все создано и обрабатывается Ransacker на столбце В вашей таблице, которая даже не существует!
опять же, быстрый отказ, я изучение Rails и Ruby уже около 2 недель, исходя из фона PHP, поэтому я никоим образом не эксперт, и это может быть ужасно неэффективно или может быть намного лучше "rails way", о котором я просто не знаю.