2015-12-07 39 views
3

如何在此上调用类似all的东西?我想在查询返回的所有通知上调用check_other_notification方法。查询数组与活动记录的关系

有人可以提出一个关于这个主动关系vs数组主题的很好的描述吗?我在很多不同的地方阅读过它,但我仍然有点困惑。

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

回答

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与AR方法的示例,并且还描述了在查询AR集合时要注意的其他一些事情。

+0

安德烈,是的,我想在每个对象上调用它。所以我应该在控制器中使用它,对吧?还有一个问题。我阅读了一些类似的收集方法。你能告诉我find_each和简单收集的区别吗? –

+0

当然我会更新答案 –

+0

Andrey,当sby调用ruby而不是SQL/active记录时,能否告诉我一个“to-avoid”示例(如果上面的代码可能)?除此之外,你知道一个很好的资源,我可以阅读一些关于这些的比较(ruby vs active record vs sql)。如果您阅读每个资源上分离的资源,那么使用哪一个很难做出心理图画。 –