为了加快我的代码,该代码当前在循环(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' }
这使用 Enumerable
的 select
API 从集合中选择与查询匹配的元素。