【问题标题】:Rails & Ransack - Sorting/searching based on a definition in the modelRails & Ransack - 根据模型中的定义进行排序/搜索
【发布时间】:2013-03-07 00:44:49
【问题描述】:

例如,我有一个带有 start_datelength 的事件(作为代表天数的整数)。

在模型中,我将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


【解决方案1】:

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

在我定义 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 way'。

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多