比方说,我有一个start_date
和length
的事件(整数代表天数)。
在模型中,我非常简单地将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" %>
如果我为end_date(<%= sort_link @q, :end_date, "End" %>
)尝试相同的操作,那么它很遗憾地会失败,因为我认为它正在寻找end_date
作为表中的列而没有找到它。
我只是愚蠢还是我试图做一些Ransack根本不做的事情?
答案 0 :(得分:10)
只是为了任何想要了解我是如何做到的人的利益:
在我定义end_date的模型中
def end_date
start_date + length.days
end
然后我为:end_date
添加了'rankingacker'方法ransacker :end_date do |r|
Arel::Nodes::SqlLiteral.new("DATE_ADD(`events`.`start_date`, INTERVAL `events`.`length` DAY)")
end
老实说,我不知道这是否是执行上述条款的最佳/正确方法,但我对SQL比熟悉Ruby / Rails更熟悉,所以它对我来说非常开放。
有效的做法是创建一个SQL,它按照与end_date(start_date + length)相同的定义对查询进行排序
我现在可以在模板中使用以下代码进行排序链接(允许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大约两周了,来自PHP的背景,所以我不是专家,这可能是非常低效或者可能会好得多“轨道方式”,我根本就不知道。