2017-07-31 34 views
0

我有一个状态字段,需要更新到expired如果状态是new并已经超过了一段时间。使用保存在after_find回调

在after_find回调中执行save以更新加载的记录时是否存在任何问题?有没有其他更适当的回调呢?

回答

1

我通常会做的是有周期性的后台工作(sidekiq/delayed_job之类),它会查找所有新近过期的记录并更新其标志。比在after_find回调中的写法少得多。

需要考虑的事情:假设您加载了100条记录以便在视图中显示并找到所有过期记录。因此,而不是1个查询,您执行101查询(一个选择和100个更新)。它直接影响页面加载时间,并且一次加载的记录越多,情况越糟糕。而在我提出的方法中,只有两个查询,其中一个是带外批量更新,根本不影响页面加载。

1

它没有固有的问题,它会工作。任何时候现有记录被实例化时都会调用after_findsave将属性插入到数据库中,但不会重新实例化对象,因此您不必担心通过在该回调中调用save来发生不必要的递归。类似的回调将是after_initialize,唯一的区别是在新对象上也调用after_initializeafter_find会更合适。

不管它是否是解决问题的最佳方法,尽管存在争议。这可能是最简单和最快的设置。但是您依赖于您的程序实例化对象以实现数据完整性。如果你需要做一个数据库转储呢?塞尔吉奥的建议可能是一个更好的方法。