【发布时间】:2013-03-07 00:44:49
【问题描述】:
例如,我有一个带有 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 根本不应该做的事情?
【问题讨论】:
-
看起来 ransack 将搜索参数转换为 ActiveRecord ORM 上的查询——除非你有一个底层数据库可以搜索的真实列,否则肯定会失败。
-
感谢@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。这确实有效,但感觉非常“hacky”。 -
@bensmithbwd - 在您的评论中很难看到完整的解决方案。小心写出一个完整的例子,这样我们就可以更好地理解解决方案。然后你可以接受你自己的答案。
-
@JavidJamae 我已经发布了一个答案,应该让它更清楚一点
标签: ruby-on-rails ruby-on-rails-3.2 ransack