6

举例来说,我有一个带有start_dateand的事件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 根本不应该做的事情?

4

1 回答 1

10

只是为了任何想看看我是如何做到的人的利益:

在我定义 end_date 的模型中

def end_date
  start_date + length.days
end

然后我为 :end_date 添加了一个 'ranksacker' 方法

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 大约 2 周了,来自 PHP 背景,所以我绝不是专家,这可能效率极低,或者可能有更好的“rails 方式” '我根本不知道。

于 2013-03-15T14:13:39.733 回答