我有一个名为Model
的模型,其中有一个名为state
的列,其中四种可能的状态为A
,B
,C
,以及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找到一种“一体化”的查询方式,所以我将尽可能多的工作卸载到数据库而不是应用程序。有什么建议?
此外,尚未选择部署数据库,它可能是最有意义的(目前正在部署到Heroku,因此PostgresQL是目前用于生产测试的),但我真的很想远离从存储过程和其他方法中删除ActiveRecord提供的抽象层。
答案 0 :(得分:0)
遗憾的是,您没有使用代码编写实际想要实现的内容。根据我的理解,你可能正在寻找一台状态机。运气好的话,你需要的一切就是使用像https://github.com/pluginaweek/state_machine
这样的宝石