Ruby on rails ActiveRecord在具有特定值的记录之后查找第一个具有值的记录

Ruby on rails ActiveRecord在具有特定值的记录之后查找第一个具有值的记录,ruby-on-rails,activerecord,stored-procedures,Ruby On Rails,Activerecord,Stored Procedures,我有一个模型,比如说model,它有一个名为state的列,四种可能的状态是a,B,C,和D 是否可以(使用ActiveRecord)在模型类中编写一个方法,该类包含一个查询,该查询查找在B记录的时间创建的的最新出现,该记录前面有一个a(中间可以有其他C和D记录)。如果表中没有A,则返回最早出现的B 表的默认范围是在DESC创建的,因此调用模型。第一个将是表中最新的记录 目前,这是我的方法: class Model < ActiveRecord::Base

我有一个模型,比如说
model
,它有一个名为
state
的列,四种可能的状态是
a
B
C
,和
D

是否可以(使用ActiveRecord)在
模型
类中编写一个方法,该类包含一个查询,该查询查找在
B
记录的时间创建的
的最新出现,该记录前面有一个
a
(中间可以有其他
C
D
记录)。如果表中没有
A
,则返回最早出现的
B

表的默认范围是在DESC创建的
,因此调用
模型。第一个
将是表中最新的记录

目前,这是我的方法:

    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
类模型?”,“B”,latestA.created_at)。最近一个“A”之后第一个“B”的最后一个记录
返回nextB.created_在if!nextB.nil?
其他的
打破
结束
latestA=self.where(“state=”和created_at<?”,“A”,latestA.created_at)。首先
结束
firstB=self.where(“state=?”,“B”).first
如果!第一个B.nil?
返回firstB.created\u在
其他的
归零
结束
结束
结束
但我试图找到一种“一体式”的ActiveRecord查询方式,因此我将尽可能多的工作转移到DB而不是应用程序。有什么建议吗


此外,部署数据库还没有被选中,它可以是最有意义的数据库(目前部署到Heroku,因此PostgresQL是目前用于生产测试的数据库),但是我真的不想使用存储过程和其他方法,因为它们需要删除ActiveRecord提供的抽象层。

不幸的是,您没有编写您真正想要的代码。据我所知,您可能正在寻找状态机。幸运的是,你所需要的一切都是使用宝石,比如