如果状态为expired
并且已经过了一段时间,我的状态字段需要更新为new
。
在after_find回调中执行save
以在加载记录时更新记录是否有任何问题?还有其他更合适的回调吗?
答案 0 :(得分:1)
我通常做的是定期后台工作(sidekiq / delayed_job等),它会找到所有新过期的记录并更新其标志。比after_find
回调中的写法更令人惊讶。
要考虑的事情:假设你加载100条记录以便在视图中显示并找到所有记录已过期。因此,您执行101查询(一次选择和100次更新),而不是一次查询。它直接影响页面加载时间,一次加载的记录越多,情况就越糟糕。在我提出的方法中,它只有两个查询,其中一个是带外质量更新,而不会影响页面加载。
答案 1 :(得分:1)
它没有固有的问题,它会起作用。只要实例化现有记录,就会调用after_find
。 save
将属性插入到数据库中,但不会重新实例化该对象,因此您不必通过在该回调中调用save
来担心不需要的递归。类似的回调是after_initialize
,唯一的区别是在新对象上调用after_initialize
。 after_find
会更合适。
它是否是解决问题的最佳方法,但值得商榷。它可能是最简单,最快捷的设置方式。但是,您依赖于程序实例化的对象以确保数据完整性。如果需要进行数据库转储怎么办?塞尔吉奥的建议可能是一个更好的方法。