1

假设我们有以下模型。

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

class Meeting < ActiveRecord::base
end

我将如何订购会议结果,以便最长的会议是集合中的第一个会议,最短的会议是最后一个会议。

就像是

Meeting.order(longest(started_at..ended_at))

显然那是行不通的。

我将如何实现这一点,最好不使用原始 SQL?

4

2 回答 2

1

我认为不使用原始 SQL 就无法做到这一点。

使用原始 SQL:

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

(与 PostGreSQL 一起使用)

于 2013-10-18T13:15:28.060 回答
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_at和时更新此列ended_at。那么你也能:

Meeting.order("duration")
于 2013-10-18T13:19:28.297 回答