按日期范围排序

时间:2013-10-18 12:47:18

标签: ruby-on-rails activerecord ruby-on-rails-4

假设我们有以下模型。

create_table :meetings do |t|
  t.datetime :started_at
  t.datetime: ended_at
end

class Meeting < ActiveRecord::base
end

我如何订购meeting_result,以便最长的会议是集合中的第一次会议,最后的会议是最短的会议。

这样的东西
Meeting.order(longest(started_at..ended_at))

显然这不起作用。

如何实现这一目标,最好不使用原始SQL?

2 个答案:

答案 0 :(得分:1)

我认为你不用原始SQL就可以做到。

使用Raw SQL:

Meeting.order('(ended_at - start_at) DESC')

(适用于PostGreSQL)

答案 1 :(得分:0)

没有SQL?我想到了两种选择。创建一个哈希数组并在那里对其进行排序,或者在数据库中添加另一列并对其进行排序。

# How many records in the meetings table? This array of hashes could get huge.
meetings_array = []
Meeting.all.each do |meeting|
  meetings_array << {id: meeting.id, started_at: meeting.started_at, ended_at: meeting.ended_at , duration: meeting.ended_at - meeting.started_at }
end
meetings_array.sort_by { |hsh| hsh[:duration] }

或者,创建另一列:

# Is it worth adding another column?
create_table :meetings do |t|
  t.datetime :started_at
  t.datetime :ended_at
  t.datetime :duration 
end

只要您同时拥有started_atended_at,就会更新此列。然后你可以:

Meeting.order("duration")