0

我有一个模型,比如说Model,它有一个名为 的列state,四种可能的状态是ABCD

是否可以(使用 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 的“一体化”查询方式,因此我将尽可能多的工作卸载到数据库而不是应用程序。有什么建议么?

此外,还没有选择部署数据库,它可以是最有意义的(当前部署到 Heroku,所以 PostgresQL 是当前用于生产测试的),但我真的很想远离存储过程以及其他将移除 ActiveRecord 提供的抽象层的方法。

4

1 回答 1

0

不幸的是,您没有用代码编写您真正想要实现的目标。据我了解,您可能正在寻找状态机。运气好的话,您需要的一切都是使用诸如https://github.com/pluginaweek/state_machine之类的 gem

于 2013-03-01T21:45:24.587 回答