查询数组与Active Record关系

时间:2015-12-07 20:27:03

标签: ruby-on-rails ruby activerecord

如何在此处拨打all之类的内容?我想在查询返回的所有通知上调用check_other_notification方法。

有人可以就此Active Relation vs数组主题提出一个很好的描述吗?我在许多不同的地方读过它,但我仍然有点困惑。

Notification
  .between_other_recipient(current_user, @user)
  .last
  .check_other_notification

1 个答案:

答案 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是完美的匹配。

修改

collectfind_each之间的区别。

find_each上引用文档:

  

find_each仅用于批处理大型   一次不能满足记忆的记录数量。如果你   只需要循环不到1000条记录,它可能更好   只是为了使用常规的查找方法。

如果使用collectmap),这是Array类中的方法 - 它会在处理之前首先将整个记录集合加载到内存中。当收集很大时,这会占用大量内存并导致问题。

重要的一点是:不使用Ruby来处理数据库的东西,当有可能使用ORM时(如果没有,SQL会这样做)。

Here is a short article显示了使用Array&vs; s&AR方法的几个示例,并且还描述了在查询AR集合时需要注意的其他一些事项。