- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在按当前日期对数组进行排序时遇到问题。
我的数据库有一个名为 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/
我想要一个指标来显示迄今为止接口(interface)上的总传入字节数。 我能得到的最接近的方法是必须在查询中指定日期,但我希望有一些可以在当天工作而不改变任何东西的东西。 我现在在特定的一天所拥有的
有什么可能在编译时知道时间和日期 (BUILDTIME),以便以可移植的方式在二进制文件(可执行文件/库)中包含有关它们创建时刻的信息? 我们目前有一个使用 sh.exe 的解决方案,并且需要在 Wi
我是一名优秀的程序员,十分优秀!