0

たとえばModel、 という列がstateあり、可能な状態はABC、の 4 つDです。

(ActiveRecord を使用して) が先行するレコードの時間のModel最新の発生を検索する単一のクエリを格納するクラスにメソッドを記述することは可能ですか (間に他のレコードが存在する可能性があります) 。テーブルに がない場合は、最も古い が返されます。created_atBACDAB

テーブルのデフォルトのスコープは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 が提供する抽象化のレイヤーを削除するその他のメソッド。

4

1 に答える 1

0

残念ながら、コードで実際に達成したいことを書いていません。私が理解したことから、おそらくステートマシンを探しているでしょう。運が良ければ、必要なものはすべてhttps://github.com/pluginaweek/state_machineなどの宝石を使用することです

于 2013-03-01T21:45:24.587 に答える