记忆是否与积极的记录关系一起使用?

时间:2017-11-16 17:57:13

标签: ruby-on-rails ruby ruby-on-rails-4 memoization

让我说我的模型中有一个方法如下。

def all_users 
  @users ||= User.all
end

我在我的模型中有其他方法,我正在为多个不同的ID进行all_users.where(id: 123)。它是否会每次执行对db的查询/命中,或者它将直接从缓存的结果集中获取记录。

2 个答案:

答案 0 :(得分:2)

请参阅有关SQL缓存的docs。如果查询完全相同,则将从缓存中获取结果。对不同ID的请求将导致单独查询。

使用#all时要小心,因为它会将所有记录加载到内存中。这可能很慢并且消耗大量内存。从长远来看,对您进行单独的User.find(X)查询会更好。

答案 1 :(得分:1)

20171117-14:44:34.627 : 8=FIX.4.4 9=70 35=0 34=6057 49=TRD 52=20171117-14:44:34.622 56=SS 10=208 20171117-14:44:34.635 : 8=FIX.4.4 9=0070 35=0 34=6876 49=SS 56=TRD 52=20171117-14:44:34.634 10=060 20171117-14:45:04.668 : 8=FIX.4.4 9=224 35=D 34=6059 49=TRD 52=20171117-14:45:04.668 56=SS 11=AGG-171117T095204000182 38=100000 40=D 44=112.402 54=2 55=USD/XXX 59=3 60=20171117-09:45:04.647 278=2cK-3ovrjdrk00X1j8h03+ 10=007 20171117-14:45:04.668 : 8=FIX.4.4 9=70 35=0 34=6058 49=TRD 52=20171117-14:45:04.642 56=SS 10=209 返回一个活动的记录关系 - 它不会获取任何数据,直到你尝试用它做某事(例如调用类似数组的方法)。当发生这种情况时,rails将加载关系的数据(如果尚未加载)。

所以,如果你做了像

这样的事情
User.all

然后你只能从数据库中获取一次。

但是,如果您使用all_users.sample(5) all_users.detect {|record| ... } where,......等返回新关系的方法,那么如果需要数据,这些关系将需要访问数据库。

joins

例如,将执行3个查询。

如果您有一个ID列表,那么all_users.where(id: 1).first all_users.where(id: 2).first all_users.where(id: 3).first (或User.find(ids)如果您想允许缺少值,则会好得多。)