我正在尝试查找记录并根据当天的壁橱日订购。
让我试着用一个例子来说明。
说约翰想知道接下来要教的时间。 John教导接下来几天(天数转换为数字,其中0 =星期日,1 =星期一......) [1,2] 。当前日期是星期五(5),因此结果应 1 。
另一个例子:
Karen想知道她下次要教的时间。凯伦在接下来的几天教授 [0,2,3] 。当天是星期四(4),因此结果应为 0 。
当前查询:
TeamOverview.where(coach: current_user.id).order(:day = [next closets day missing here])
型号:
t.string :name
t.integer :coach
t.int :day
模型中可能的记录:
id: 1, name: John, day: 1
id: 2, name: John, day: 2
id: 3, name: Karen, day: 0
id: 4, name: Karen, day: 2
id: 5, name: Karen, day: 3
答案 0 :(得分:1)
为了避免复杂的解决方案,我宁愿选择所有工作日并在ruby中完成工作。查询的最大结果数为7 - 应该没问题。此外,您已经有了这样的查询(可能在TeamOverview范围内)的变化很大,您可以重复使用它,并且在第二次调用时它也可能来自查询缓存。
working_days = TeamOverview.where(coach: current_user.id).pluck(:day)
working_days.find { |day_num| day_num > today_num } || working_days.first
答案 1 :(得分:0)
为了让第二天排序最高,您需要按当天的距离订购。
不幸的是,%
(使用postgresql的模运算符保留了符号
对于负值。因此,您无法使用day - current_day
。
但是下面表达式的排序将根据你的内部逻辑对行进行排序:
(7 + day - current_day) % 7
WHere day
是模型行的日期,current_day
是当前日期用于计算的值。
如果您更喜欢更明确的解决方案,可以转向
CASE WHEN day < current_day THEN 7 + day - current_day ELSE day - current_day END
答案 2 :(得分:0)
(res =TeamOverview.where(coach: current_user.id).order("day").find(:first, :conditions => [ "(day > ? )",current_day]) ) ? res : TeamOverview.where(coach: current_user.id).order("day").find(:first, :conditions => [ "(day < ? )",current_day])
这将为您提供所需的结果
答案 3 :(得分:0)
您可以使用两部分顺序在纯SQL
中实现此目的:
SELECT *
FROM team_overviews
ORDER BY day < (current_day), day
ActiveRecord
中的一个简单实现是:
TeamOverview
.where(coach: current_user.id)
.order("day < #{current_day}")
.order(:day)
或者,如果您愿意:
TeamOverview
.where(coach: current_user.id)
.order("day < #{current_day}, day")
警告:上述代码可能容易受到SQL注入攻击。确保您信任current_day
的来源,并在必要时进行清理(在这种情况下,可能只需致电to_i
)。
不幸的是,looking at the rails source code(截至发布时的当前4.2.6
版本),?
ActiveRecord方法似乎不支持order
语法 - 即以下内容无效:TeamOverview.order("day < ?", current_day)
。也许这对图书馆来说是一个很好的补充。
答案 4 :(得分:-1)
以下代码将在下一个即将到来的日期找到,如果您需要几天,则删除.first
参数
next_day = TeamOverview.where("day > ? and coach_id = ?", current_day, current_user.id).order("day").first