2017-10-21 180 views
3

我看到了。哪裏聲明做出了很多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

回答

4

看起來好像在這兩種情況下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後看到查詢。