Ruby on rails 回忆录是否适用于活动记录关系?

Ruby on rails 回忆录是否适用于活动记录关系?,ruby-on-rails,ruby,ruby-on-rails-4,memoization,Ruby On Rails,Ruby,Ruby On Rails 4,Memoization,假设我的模型中有一个方法,如下所示 def all_users @users ||= User.all end 在我的模型中还有另外一种方法,我对所有用户进行操作,其中(id:123)用于多个不同的id。它将每次执行对db的查询/命中,还是直接从缓存的结果集获取记录 请参阅有关SQL缓存的说明。如果查询完全相同,则将从缓存中获取结果。对不同ID的请求将导致单独的查询 但是,使用#all时要小心,因为它会将所有记录加载到内存中。这可能会很慢并消耗大量内存。从长远来看,进行单独的User.f

假设我的模型中有一个方法,如下所示

def all_users 
  @users ||= User.all
end
在我的模型中还有另外一种方法,我对所有用户进行
操作,其中(id:123)
用于多个不同的id。它将每次执行对db的查询/命中,还是直接从缓存的结果集获取记录

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

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

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


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

User.all
返回一个活动记录关系-它不会获取任何数据,直到您尝试对其执行某些操作(例如对其调用类似数组的方法)。发生这种情况时,rails将加载关系的数据(如果尚未加载)

所以如果你做像这样的事情

all_users.sample(5)
all_users.detect {|record| ... }
然后,您将只从数据库获取一次

但是,如果使用诸如
where
join
。。。如果返回一个新的关系,那么如果需要这些关系的数据,这些关系将需要访问数据库

all_users.where(id: 1).first
all_users.where(id: 2).first
all_users.where(id: 3).first
例如,将执行3个查询


如果您有一个id列表,那么最好执行
User.find(ids)
(或者
User.where(id:ids)
,如果您想允许缺少值)。

User.all
返回一个活动记录关系-在您尝试使用它之前,它不会获取任何数据(例如,在它上面调用类似数组的方法)。发生这种情况时,rails将加载关系的数据(如果尚未加载)

所以如果你做像这样的事情

all_users.sample(5)
all_users.detect {|record| ... }
然后,您将只从数据库获取一次

但是,如果使用诸如
where
join
。。。如果返回一个新的关系,那么如果需要这些关系的数据,这些关系将需要访问数据库

all_users.where(id: 1).first
all_users.where(id: 2).first
all_users.where(id: 3).first
例如,将执行3个查询


如果您有一个id列表,那么最好执行
User.find(ids)
(或者
User.where(id:ids)
,如果您想允许缺少值)。

因此,我有一个10个id的列表,我循环id并执行
所有用户。其中(id:#id)
它将执行10个quries?因此我有一个包含10个id的列表,我在id上循环并执行
所有用户。其中(id:#id)
它将执行10个quries?这听起来像是一个错误。你能解释一下为什么你想记住这些问题,并详细说明你试图解决的实际问题吗?这听起来像是一个挑战。你能解释一下为什么要记住这些查询,并详细说明你试图解决的实际问题吗?