Ruby on Rails的:要迭代的关系或关联

Ruby on Rails的:要迭代的关系或关联

问题描述:

我看到了。哪里声明做出了很多CACHE用户负载消息比联想这么多要求的最佳方式。这是真的还是不?Ruby on Rails的:要迭代的关系或关联

在这种情况下,我得到一个ActiveRecord_Relation:

@dogs = Dog.where(user_id: current_user.id).order('created_at DESC') 

在这等情况下,我得到一个ActiveRecord_Associations_CollectionProxy:

@dogs = current_user.dogs.order('created_at DESC') 

当我在视图中遍历

<% @dogs.each do |dog| %> 
<div><%= dog.name %></div> 
<% end %> 

我在控制台日志中得到不同的信息:

ActiveRecord_Relation:

User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 

ActiveRecord_Associations_CollectionProxy:

User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 15], ["LIMIT", 1]] 
Dog Load (0.6ms) SELECT "dogs".* FROM "dogs" WHERE "dogs"."user_id" = ? ORDER BY "dogs"."created_at" DESC [["user_id", 15]] 

至极是更好的办法?非常感谢你。

+0

能否请您包括通过收集迭代视图代码? – hoffm

看起来好像在这两种情况下current_user应该只被调用一次。想必current_user方法有这样一个实现:

def current_user 
    # read some cookies or something 
    User.find_by([...]) 
end 

这不是很清楚,我为什么User.find_by将在“ActiveRecord_Relation”版本被调用很多次,但是这似乎是它一定是发生了什么。 Rails缓存了这个查询的结果,所以每次你第一次点击一个温暖的缓存。

为了排除这一点,你可以memoize#current_user。这应该防止活动记录在第一次调用current_user后看到查询。