我有一个有趣的困境。我有一个应用程序,当创建一个新记录(在这种情况下是一个用户)时,它将被发布到另一个应用程序(具体信息是)。
现在我可以使用User.last
并获得最新最好的内容。保存记录后立即发布,只需要一秒钟。假设我有500个用户立即注册。
发布到第二个应用程序的500条新记录,对于我需要说的每一条:
如果此用户是新用户,请使用它执行x,否则请忽略它。
我正在使用whenever gem在第二个应用程序上创建一个cron作业,该应用程序每5秒钟监视一次新记录。在那个时候可能会有5个新的recods通过,所以我需要更新上面的声明说:
如果记录为5秒或更短时间用x做,则忽略它。
我可以执行以下操作:
Users.all.each do |u|
*if u is 5 seconds or less old*
do something here
end
end
我不确定if语句是什么,它是u.created_at <= 5.seconds
??
答案 0 :(得分:1)
User.where('created_at >= ?', 5.seconds.ago)
会找到不超过五秒的记录。但听起来你可能会更好地使用API将创建事件推送到你的第二个应用程序。
答案 1 :(得分:1)
你可以。它看起来像这样:
gauge = Time.now - 5
Users.all.each do |u|
u.created_at >= gauge
# do something here
end
end
问题是运行循环需要时间。即使您运行了更高效的查询,您仍然依赖时间戳来获得高精度。
User.where('created_at >= ?', Time.now - 5)
如果系统出现延迟,假设计算机需要0.5秒才能查询,您将错过在.5秒间隙内创建的所有用户。最好向用户添加published
列,将记录标记为已发布,然后检查未发布的记录。
users = User.where(published: nil)
users.each { |u| u.publish }
或者,正如另一篇文章所述,寻找一个推动创建活动的API。