-->

导轨和洗劫 - 搜索排序基于/模型中的一个定义(Rails & Ransack - Sorting/

2019-07-21 02:43发布

说,例如我有一个事件start_datelength (如整数,表示天)。

在这个模型中,我定义end_datestart_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作为表中的列,并没有发现它。

我只是愚蠢还是我试图做一些洗劫根本没有做呢?

Answer 1:

只是任何人都希望看到我是如何做的的好处:

在我定义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的背景的,所以我绝不是一个专家,这可能是效率极其低下或有可能是一个更好的“轨道方式“我根本不知道。



文章来源: Rails & Ransack - Sorting/searching based on a definition in the model