Ruby 活动记录关系集合搜索



为了加快我的代码,该代码当前在循环(bar = find_or_create_by()....(中运行了太多的数据库查询,以便创建一个包含诸如foo.bar_id = bar.id之类的连接条目,我想我会将所有bars存储在内存中,并在循环之前加载一个Bar.all。问题是如何在所有这些bars中快速搜索特定bar.name?我尝试了bar.where(name: ...)但这又回到了数据库。

如果我正确理解了您的问题,为了加快速度,您可以获取所有柱线,并将它们放入内存中,在一个将每个 (bar.name( 映射到柱线数组的哈希中。

例如:

bars_hash = Bar.all.group_by(&:name)

然后

bars_hash[name]

将返回与名称匹配的所有条形,如果没有,则返回nil。这样,您将避免对每个Foo进行顺序搜索。

但如果你有,我希望你的记忆不会填满,如果你有太多Bar

我认为你需要的是:

bars.select { |bar| bar.name == 'the name I want' }

这使用 Enumerableselect API 从集合中选择与查询匹配的元素。

最新更新