让我说我的模型中有一个方法如下。
def all_users
@users ||= User.all
end
我在我的模型中有其他方法,我正在为多个不同的ID进行all_users.where(id: 123)
。它是否会每次执行对db的查询/命中,或者它将直接从缓存的结果集中获取记录。
答案 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)
如果您想允许缺少值,则会好得多。)