ruby-on-rails – 按当天排序的活动记录
我有一个问题按当前日期排序数组.
我的数据库有一个名为day的字段 一天有星期几,例如:星期一,星期二等. 我正在尝试按当前日期对索引视图页面进行排序. 我想在我的控制器中做这样的事情, @happies = Happy.where(id: @search.results.map(&:id)) .page(params[:page]) .where(:day => Date.today.strftime('%A').capitalize.to_s) 但是,与星期一那天只返回幸福而不是仅仅在当天等于白天的日子. 在我看来,我也考虑过这样做 喜欢的东西 <%@ happies.sort_by(:day => Date.today.strftime(‘%A’).capitalize.to_s).each do | happy | %GT; 上面的方法不起作用,但是我试图实现我想达到的目标.有关如何实现这一点的任何想法? 也许有一个activeview助手? 解决方法
如果你没有分页,你可以用普通ruby对结果进行排序,如下所示:
day_order = %w(Tuesday Wednesday Thursday Friday Saturday Sunday Monday) @happies = @happies.sort_by{|happy| day_order.index(happy.day)} sort_by获取一个块,该块返回要排序的值. 但是,您似乎使用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之间的整数,而不是字符串.然后你可以使用modulo运算符,如下所示: 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") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |