1

次のモデルがあるとしましょう。

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

class Meeting < ActiveRecord::base
end

最長のミーティングがコレクションの最初のミーティングになり、最短のミーティングが最後のミーティングになるように、meetings_result を並べ替えるにはどうすればよいでしょうか。

何かのようなもの

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 がありませんか? 2つのオプションが思い浮かびます。ハッシュの配列を作成してそこでソートするか、データベースに別の列を追加してそれをソートします。

# 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 に答える