2014-02-20 51 views
22

如果我做User.all.pluck(:email)那麼它工作正常。如何從用戶陣列採摘電子郵件

但如果我這樣做

arr = Array.new 
arr = User.all 

然後

arr.pluck(:email) 

這是提高以下錯誤

undefined method `pluck' for #<Array:0x007f4ff8daf3c8> 

,這意味着我不能陣列勇氣使用,所以我們怎麼能得到在上面的一行中記錄數組中的特定字段值。 我不想遍歷數組中的每條記錄。

+0

'User.all.pluck(:email)'工作正常嗎?你使用的是什麼rails版本? – xlembouras

+0

m使用Rails4和ruby2.0.0 –

+0

每個人的答案工作....所以我會去投票的所有,但接受@apneadiving的答案 –

回答

49

pluck是做一個極簡數據庫查詢有用。

當你有一個數組,只需使用map

arr.map(&:email) 
+0

但是在一個真正的大陣列,你可能會更好用新的數據庫查詢使用'pluck' ... – Jon

+1

@Jon no。一旦你在內存中的數據,一切都比另一個數據庫調用 – apneadiving

+1

也許。但是替換'arr = User.all; arr.map'與'User.pluck'更加優化。他的問題在於是否可能改變數據庫的初始選擇方面含糊不清。我只是認爲讓數據庫提供你所需要的而不是在提取數據後操作數據的性能改進值得考慮。 – Jon

1

轉換爲數組這種方式內存霸佔。相反,你可以使用:

arr = User.scoped 
arr.pluck :email 

或更容易閱讀:

User.scoped.pluck :email 

這將確保直到他們實際需要的用戶對象不會被加載到內存中。

6

pluck(:x)相當於ActiveRecord集合上的select(:x).map(&:x)

如果你有一個數組,Array#map及其別名Array#collect做同樣的工作。

如果使用

User.scoped.pluck(:email)

您的查詢就會像

SELECT users.email FROM users

因此,要回答這個問題,你鼓不起陣列上使用,pluckActiveRecord::Calculations方法,而不是數組之一。

+0

它並不完全等同。 'pluck'會導致對DB查詢的SELECT部分​​進行修改。 'map'方法遍歷'Array'。雖然產品可能相同,但提供這些產品的流程絕對不是等同的。 – Jon

+0

@Jon我說Activerecord的''''''鏈接'map'的組合是等價的,而不是單獨的'map'。 – xlembouras

+0

我認爲''pluck''''lele''''lele'''''等價於'select'和'map' *在一起*,就像@xlembouras一樣。他並不是說他們兩個都是自己的。 –

相關問題