假设我们有以下模型。
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?
答案 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_at
和ended_at
,就会更新此列。然后你可以:
Meeting.order("duration")