我有一个状态字段,需要更新到expired
如果状态是new
并已经超过了一段时间。使用保存在after_find回调
在after_find回调中执行save
以更新加载的记录时是否存在任何问题?有没有其他更适当的回调呢?
我有一个状态字段,需要更新到expired
如果状态是new
并已经超过了一段时间。使用保存在after_find回调
在after_find回调中执行save
以更新加载的记录时是否存在任何问题?有没有其他更适当的回调呢?
我通常会做的是有周期性的后台工作(sidekiq/delayed_job之类),它会查找所有新近过期的记录并更新其标志。比在after_find
回调中的写法少得多。
需要考虑的事情:假设您加载了100条记录以便在视图中显示并找到所有过期记录。因此,而不是1个查询,您执行101查询(一个选择和100个更新)。它直接影响页面加载时间,并且一次加载的记录越多,情况越糟糕。而在我提出的方法中,只有两个查询,其中一个是带外批量更新,根本不影响页面加载。
它没有固有的问题,它会工作。任何时候现有记录被实例化时都会调用after_find
。 save
将属性插入到数据库中,但不会重新实例化对象,因此您不必担心通过在该回调中调用save
来发生不必要的递归。类似的回调将是after_initialize
,唯一的区别是在新对象上也调用after_initialize
。 after_find
会更合适。
不管它是否是解决问题的最佳方法,尽管存在争议。这可能是最简单和最快的设置。但是您依赖于您的程序实例化对象以实现数据完整性。如果你需要做一个数据库转储呢?塞尔吉奥的建议可能是一个更好的方法。