2017-04-21 32 views
0

由於對象構造的成本,我知道pluck比使用selectmapping object更高效。 但我發現pluck不使用ActiveRecord_Associations_CollectionProxy的緩存。例如:'pluck'每次都重新獲取緩存的關聯?

irb(main):001:0> u = User.take 
irb(main):002:0> puts Benchmark.measure { u.rides.map(&:id) } 
    Ride Load (1.3ms) SELECT "rides".* FROM "rides" WHERE "rides"."user_id" = $1 ORDER BY "rides"."created_at" DESC [["user_id", 1]] 
    0.040000 0.020000 0.060000 ( 0.072337) 
irb(main):003:0> puts Benchmark.measure { u.rides.map(&:id) } # once again, fetching data from the cache 
    0.000000 0.000000 0.000000 ( 0.000103) 
irb(main):004:0> puts Benchmark.measure { u.rides.pluck(&:id) } 
    (1.6ms) SELECT "rides"."id" FROM "rides" WHERE "rides"."user_id" = $1 ORDER BY "rides"."created_at" DESC [["user_id", 1]] 
    0.010000 0.010000 0.020000 ( 0.020381) 
irb(main):005:0> puts Benchmark.measure { u.rides.pluck(&:id) } # once again, refetch data from database 
    (1.5ms) SELECT "rides"."id" FROM "rides" WHERE "rides"."user_id" = $1 ORDER BY "rides"."created_at" DESC [["user_id", 1]] 
    0.010000 0.010000 0.020000 ( 0.020810) 

這是正常的嗎?用這種方法使用mappingselect而不是pluck更好嗎?

順便說一下,我正在使用Rails-4。

最新通報

我不知道這是一個錯誤,它似乎是由Rails的固定5. rails/rails#25976

回答

0

pluck去到DB每次。當您不會在內存中加載所有匹配的記錄,而只是想要特定列的值時,它非常有用。

您有可能要爲db獲取選定列值的記錄已經加載到內存中。這就是你的例子所顯示的。第一次打電話給u.rides加載該用戶的所有記錄。隨後對該集合的調用只會在內存對象中用於不同的操作。

我建議閱讀http://blog.arkency.com/2013/12/rails4-preloading/一次。

+0

我不知道'pluck'不能處理緩存關聯。國際海事組織,我想它應該是,爲什麼'pluck'不支持這個功能? – HFX

+1

它適用於Rails 5。 – HFX

相關問題