gpt4 book ai didi

ruby-on-rails - Rails & Ransack - 根据模型中的定义进行排序/搜索

转载 作者:行者123 更新时间:2023-12-04 14:02:40 25 4
gpt4 key购买 nike

比如说我有一个事件 start_datelength (作为代表天数的整数)。

在我定义的模型中 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 根本没有做的事情?

最佳答案

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

在我定义 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 方式” '我根本不知道。

关于ruby-on-rails - Rails & Ransack - 根据模型中的定义进行排序/搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15261071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com