如何在此处拨打all
之类的内容?我想在查询返回的所有通知上调用check_other_notification
方法。
有人可以就此Active Relation vs数组主题提出一个很好的描述吗?我在许多不同的地方读过它,但我仍然有点困惑。
Notification
.between_other_recipient(current_user, @user)
.last
.check_other_notification
答案 0 :(得分:2)
据我了解,您希望在查询返回的每个对象上调用check_other_notification
方法。
如果是这样,请使用find_each
:
Notification
.between_other_recipient(current_user, @user)
.find_each do |notification|
notification.check_other_notification
end
find_each
如果是非常有效的方法,因为它批量处理对象(默认情况下,批量大小为1000条记录,但您可以指定任何其他金额)。
在你的情况下,each
会起作用,因为我认为没有成千上万的通知,但如果是这样的话 - find_each
是完美的匹配。
collect
和find_each
之间的区别。
在find_each
上引用文档:
find_each
仅用于批处理大型 一次不能满足记忆的记录数量。如果你 只需要循环不到1000条记录,它可能更好 只是为了使用常规的查找方法。
如果使用collect
(map
),这是Array类中的方法 - 它会在处理之前首先将整个记录集合加载到内存中。当收集很大时,这会占用大量内存并导致问题。
重要的一点是:不使用Ruby来处理数据库的东西,当有可能使用ORM时(如果没有,SQL会这样做)。
Here is a short article显示了使用Array&vs; s&AR方法的几个示例,并且还描述了在查询AR集合时需要注意的其他一些事项。