2013-03-07 35 views
6

说例如我有一个事件start_datelength(以整数表示天数)。Rails&Ransack - 根据模型中的定义进行排序/搜索

在我定义end_datestart_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

看起来像ransack将搜索参数转换为ActiveRecord ORM上的查询 - 除非您有底层数据库可以搜索的实列,否则这肯定会失败。 – bdares 2013-03-07 02:06:18

+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 2013-03-07 03:15:08

+0

@bensmithbwd - 在评论中很难看到完整的解决方案。谨慎写出一个完整的例子,以便我们更好地理解解决方案。然后你可以接受你自己的答案。 – 2013-03-13 02:16:48

回答

10

只为任何人想要看我是怎么做的的好处:

在我定义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更熟悉SQL,因此它对我来说非常开放。

什么是有效的作用是创建一块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的背景,所以我不是专家,这可能是非常低效的,或者可能会有很多更好的'轨道',我根本不知道。

相关问题