如何在此上调用类似all
的东西?我想在查询返回的所有通知上调用check_other_notification
方法。查询数组与活动记录的关系
有人可以提出一个关于这个主动关系vs数组主题的很好的描述吗?我在很多不同的地方阅读过它,但我仍然有点困惑。
Notification
.between_other_recipient(current_user, @user)
.last
.check_other_notification
如何在此上调用类似all
的东西?我想在查询返回的所有通知上调用check_other_notification
方法。查询数组与活动记录的关系
有人可以提出一个关于这个主动关系vs数组主题的很好的描述吗?我在很多不同的地方阅读过它,但我仍然有点困惑。
Notification
.between_other_recipient(current_user, @user)
.last
.check_other_notification
据我所知,你想对查询返回的每个对象调用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与AR方法的示例,并且还描述了在查询AR集合时要注意的其他一些事情。
安德烈,是的,我想在每个对象上调用它。所以我应该在控制器中使用它,对吧?还有一个问题。我阅读了一些类似的收集方法。你能告诉我find_each和简单收集的区别吗? –
当然我会更新答案 –
Andrey,当sby调用ruby而不是SQL/active记录时,能否告诉我一个“to-avoid”示例(如果上面的代码可能)?除此之外,你知道一个很好的资源,我可以阅读一些关于这些的比较(ruby vs active record vs sql)。如果您阅读每个资源上分离的资源,那么使用哪一个很难做出心理图画。 –