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", о котором я просто не знаю.