たとえばModel
、 という列がstate
あり、可能な状態はA
、B
、C
、の 4 つD
です。
(ActiveRecord を使用して) が先行するレコードの時間のModel
最新の発生を検索する単一のクエリを格納するクラスにメソッドを記述することは可能ですか (間に他のレコードが存在する可能性があります) 。テーブルに がない場合は、最も古い が返されます。created_at
B
A
C
D
A
B
テーブルのデフォルトのスコープはcreated_at DESC
であるため、呼び出しModel.first
はテーブル内の最新のレコードになります。
現在、これは私の方法です:
class Model < ActiveRecord::Base
def self.getLatestBTime
latestA = self.where("state = ?", "A").first # Record of most recent "A"
while 1
if !latestA.nil?
nextB = self.where("state = ? AND created_at > ?", "B", latestA.created_at).last # Record of the first "B" after the most recent "A"
return nextB.created_at if !nextB.nil?
else
break
end
latestA = self.where("state = ? AND created_at < ?", "A", latestA.created_at).first
end # End while
firstB = self.where("state = ?", "B").first
if !firstB.nil?
return firstB.created_at
else
return nil
end
end
end
しかし、私は ActiveRecord への「オールインワン」スタイルのクエリを見つけようとしているので、アプリケーションではなく DB にできるだけ多くの作業をオフロードしています。助言がありますか?
また、展開データベースは選択されておらず、実際には最も理にかなっているものにすることができます (現在 Heroku に展開しているため、PostgresQL は現在運用テストに使用されているものです)、ストアド プロシージャから離れたいと思います。および ActiveRecord が提供する抽象化のレイヤーを削除するその他のメソッド。