gpt4 book ai didi

ruby-on-rails - 按当天的 Active Record 顺序

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:26 26 4
gpt4 key购买 nike

我在按当前日期对数组进行排序时遇到问题。

我的数据库有一个名为 day 的字段

day有星期几,例如:Monday , Tuesday

我正在尝试按 current day 对我的索引 View 页面进行排序.

我想在我的 Controller 中做这样的事情,

@happies = Happy.where(id: @search.results.map(&:id))
.page(params[:page])
.where(:day => Date.today.strftime('%A').capitalize.to_s)

但不是返回 only开心的一天Monday我想 order通过 day其中 day等于 current day .

在我看来我也想过这样做

用类似的东西

<% @happies.sort_by(:day => Date.today.strftime('%A').capitalize.to_s).each do |happy| %>

以上内容不起作用,但我正在尝试实现我想要实现的目标。关于如何实现这个的任何想法?

也许有一个 activeview 助手?

最佳答案

如果你没有分页,你可以像这样用普通的 ruby​​ 对结果进行排序:

day_order = %w(Tuesday Wednesday Thursday Friday Saturday Sunday Monday)
@happies = @happies.sort_by{|happy| day_order.index(happy.day)}

sort_by 接受一个 block ,该 block 返回要排序的值。

但是,您似乎在使用 will_paginate 进行分页。这很好,但它使事情变得更复杂。

分页必然通过限制和偏移量发生在数据库中(以避免将表的全部内容返回给 Rails 进程)。因此,您希望排序也发生在数据库中。如果您要在 ruby​​ 中排序(如上所述),您将在 分页后排序,这意味着第一页会给您基本上随机的结果,然后您将对它们进行排序。可能不是您想要的。

长话短说,您可能想使用 order 而不是 sort_by,为此我将不得不深入研究 SQL:

@happies = Happy.where(id: @search.results.map(&:id))
.page(params[:page])
.order("CASE day WHEN 'Tuesday' THEN 0 " \
"WHEN 'Wednesday' THEN 1 " \
"WHEN 'Thursday' THEN 2 " \
"WHEN 'Friday' THEN 3 " \
"WHEN 'Saturday' THEN 4 " \
"WHEN 'Sunday' THEN 5 " \
"WHEN 'Monday' THEN 6 END")

如果您想避免使用 SQL,也许可以为此使用 Arel,我不确定。

编辑

我现在明白你想从今天开始,即不像我那样硬编码为星期二。要修复我的 SQL 版本——并借鉴@Snarf 的回答——你可以这样做:

days = %w(Monday Tuesday Wednesday Thursday Friday Saturday Sunday)
days.rotate!(days.index(Time.zone.now.strftime("%A")))
case_pieces = days.each_with_index.map do |day, i|
"WHEN '#{day}' THEN #{i}"
end

@happies = Happy.where(id: @search.results.map(&:id))
.page(params[:page])
.order("CASE day #{case_pieces.join(' ')} END")

另一个想法

如果我自己编写应用程序,我很想将日期存储为 0 到 6 之间的整数,而不是字符串。然后您可以使用模运算符进行排序,如下所示:

days = %w(Monday Tuesday Wednesday Thursday Friday Saturday Sunday)
day_offset = days.index(Time.zone.now.strftime("%A"))
@happies = Happy.where(id: @search.results.map(&:id))
.page(params[:page])
.order("(day - #{day_offset} + 7) % 7")

关于ruby-on-rails - 按当天的 Active Record 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192928/

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