说,例如我有一个事件start_date
和length
(如整数,表示天)。
在这个模型中,我定义end_date
为start_date + length.days
很简单,你所期望的:
def end_date
start_date + length.days
end
所有工作在模板很好,我可以用event.end_date
显示起始日期加上然而,许多天的长度设定为, 但是 ,我想现在通过使用搜查结束日期排序的事件。
排序链接, start_date
是这样的: <%= sort_link @q, :start_date, "Start" %>
如果我尝试END_DATE相同的( <%= sort_link @q, :end_date, "End" %>
),这不幸的是静静地失败,因为我认为它是有在寻找end_date
作为表中的列,并没有发现它。
我只是愚蠢还是我试图做一些洗劫根本没有做呢?
只是任何人都希望看到我是如何做的的好处:
在我定义END_DATE模型
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的,通过相同的定义订单查询为END_DATE(起始+长度)
现在我可以在模板中使用的一种链接下面的代码(允许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的背景的,所以我绝不是一个专家,这可能是效率极其低下或有可能是一个更好的“轨道方式“我根本不知道。