在after_find回调中使用save

时间:2017-07-31 17:18:46

标签: ruby-on-rails activerecord

如果状态为expired并且已经过了一段时间,我的状态字段需要更新为new

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

2 个答案:

答案 0 :(得分:1)

我通常做的是定期后台工作(sidekiq / delayed_job等),它会找到所有新过期的记录并更新其标志。比after_find回调中的写法更令人惊讶。

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

答案 1 :(得分:1)

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

它是否是解决问题的最佳方法,但值得商榷。它可能是最简单,最快捷的设置方式。但是,您依赖于程序实例化的对象以确保数据完整性。如果需要进行数据库转储怎么办?塞尔吉奥的建议可能是一个更好的方法。