2013-03-07 2 views
6

Скажем, например, у меня есть событие с start_date и length (как целое число, представляющее дни).Rails & Ransack - Сортировка/поиск на основе определения в модели

В модели я определяю end_date в 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 просто не было сделано?

+0

похоже, что ransack переводит параметры поиска в запросы на ORM ActiveRecord, которые, безусловно, потерпят неудачу, если у вас нет реального столбца, который может искать базовая БД. – bdares

+0

Спасибо за комментарий @bdares. Теперь мне удалось установить в модели «ransacker: end do | r |»: «Arel :: Nodes :: SqlLiteral.new (« DATE_ADD (events.start_date, INTERVAL events.length DAY) »). Что вызывает запрос: 'SELECT DISTINCT events. * FROM events ORDER BY DATE_ADD (events.start_date, INTERVAL events.length DAY) DESC LIMIT 30 OFFSET 0'. Это работает, но чувствует себя ужасно «взломанным». – bensmithbwd

+0

@bensmithbwd - Трудно увидеть полное решение в вашем комментарии. Позаботьтесь о том, чтобы написать полный пример, чтобы мы могли лучше понять решение. Тогда вы можете принять свой собственный ответ. –

ответ

10

Только в интересах тех, кто хочет видеть, как я это сделал:

В модели, где я определила end_date

def end_date 
    start_date + length.days 
end 

Затем я добавил метод «ranksacker» для: датой_окончания

ransacker :end_date do |r| 
    Arel::Nodes::SqlLiteral.new("DATE_ADD(`events`.`start_date`, INTERVAL `events`.`length` DAY)") 
end 

Я честно не знаю, является ли это лучшим/правильным способом для выполнения вышеприведенного предложения, но я гораздо больше знаком с SQL, чем с Ruby/Rails, поэтому он работал для меня настолько открытым.

Что это эффективно делает это создать кусок SQL, который заказывает запрос по тому же определению, как датой_окончания (Дата_начала + длина)

теперь я могу в шаблоне использовать следующий код для ссылки сортировки (что позволяет грабитель обрабатывать 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, поэтому я НЕ НУЖЕН экспертом, и это может быть ужасно неэффективным или может быть много лучше «рельсов», о которых я просто не знаю.

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