首页 > 解决方案 > 更好地使用每个并检查类型与在哪里过滤 ActiveRecord 关系中的类型

问题描述

想知道说事件是否是一个 ActiveRecord 关系,这......

events.each do |e|
    next unless e.game?
    ....

比这还糟糕……

es = events.where(event_type: "game")
es.each do |e|
    ....

我在想通过 SQL 过滤可能比遍历每个更快,但不确定遍历每个是否在性能上没有不同

标签: ruby-on-rails-4

解决方案


每个都慢得多。您应该始终将 ActiveRecord 方法/查询优先于普通 Ruby。

es = events.where(event_type: "game")
es.find_each do |e|
    ....

events.where(...)将返回一个 ActiveRecord 关系。因此,您可以使用find_each. 文档建议不要find_each在小型集合上使用,但我喜欢计划可伸缩性

编辑:如果您有任何限制或偏移量,find_each将忽略限制并使用将find_in_batches限制覆盖为 1000 的默认值。


推荐阅读