ActiveRecord在具有特定值的记录之后找到具有值的第一个记录

时间:2013-03-01 19:25:35

标签: ruby-on-rails activerecord stored-procedures

我有一个名为Model的模型,其中有一个名为state的列,其中四种可能的状态为ABC,以及D

是否可以(使用ActiveRecord)在Model类中编写一个方法,该方法包含一个查询,该查询可查找created_at记录的B时间的最新出现时间。前面有A(中间可能有其他CD条记录)。如果表格中没有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提供的抽象层。

1 个答案:

答案 0 :(得分:0)

遗憾的是,您没有使用代码编写实际想要实现的内容。根据我的理解,你可能正在寻找一台状态机。运气好的话,你需要的一切就是使用像https://github.com/pluginaweek/state_machine

这样的宝石