在ActiveRecord中有一种方法可以缓存`.all`,以便`.find_by`可以使用它。

时间:2014-10-09 16:05:11

标签: ruby-on-rails ruby postgresql activerecord

我有一个循环,并根据远程记录更新我的记录。因此,我最终通过名为19的两个字符串键选择symbol个对象的某个子集。我想做的是减少Postgres调用以调用.all一次,然后继续使用find_by_symbol语法在需要时抓取它。

2 个答案:

答案 0 :(得分:1)

或者你可以建立一个哈希查找并处理"缓存"自己。

Hash[Object.all.map{|object| [object.symbol, object]}]

答案 1 :(得分:0)

使用all获取数据后,它将成为Ruby对象,而不是作用域,因此您需要使用Enumerable中的方法来获取它:

Example.all.find { |r| r.symbol == 'example' }

其中类似于:

Example.find_by(symbol: 'example')

同样地:

# Ruby Array
Example.all.select(symbol: 'example')

# ActiveRecord scope
Example.where(symbol: 'example')

显然,您可以缓存Example.all的结果并针对它运行方法,而不是每次都重新加载。