2013-04-25 87 views
1

我一直在看Rails文檔,找不到這個。列表模型的領域在軌道

可以說我有一個型號User字段strength

如何獲取陣列中每個模型對象實例的所有strength的列表?

list_of_str = [1,2,3,4,等等。]

我知道,你可以打電話User.all,並通過他們的每一個強度的領域的迭代,並將它們添加到列表中,但有一個更優雅這樣做的方式?

+3

你在尋找什麼樣的優雅?你可以通過'User.all.map(&:strength)'得到所有'強化'的數組。它是優雅的方式嗎? :) – 2013-04-25 06:22:44

回答

4
User.pluck 'strength' 

新的軌道3.2如果我的記憶是正確的

您可以使用

User.uniq.pluck 'strength' 

如果你需要避免重複,你也可以用範圍和條件,結合這一點,例如

User.where(...).pluck 'strength' 
+0

絕對是這樣做的正確方法 - 不會對數據庫施加不必要的負載,不會實例化一堆ORM對象,只需運行'select users.strength from users'並將輸出轉換爲簡單的字符串數組。 – bdares 2013-04-25 06:41:23

+0

您可以使用'User.uniq.pluck:strength'來避免重複。 – 2013-04-25 07:05:42

+0

好的呼叫斯文! – 2013-04-25 08:27:52

1

可以使用該選擇方法時,它產生其中檢索只有所需的字段的值的查詢(其不是加載從數據庫中的所有模型數據更快):

User.select(:strength) 

這仍然返回模型對象的數組,所以你必須使用地圖,僅保留值的數組:

User.select(:strength).map(&:strength) 

模型對象的創建將不僅僅是查詢數據庫的價值觀慢,但使用如果性能不重要,應避免使用原始SQL 在這個地方。

編輯:還有一種更好的方法(pluck),請參閱接受的答案。

1

如果你真的在不同strength之後:

User.select('distinct strength').pluck(:strength) 

會得到它們。如果你不關心重複的話,那麼Frederick Cheung的簡單的pluck將是一個好主意。

+1

太棒了!不知道'拔'。但我認爲'User.uniq.pluck(:strength)'不會創建重複內容,並且不會強制您將字符串作爲外部SQL傳遞。 – 2013-04-25 07:04:16

+0

@SvenKoschnicke:確實,'.uniq.pluck'最終會做一個簡單的'從用戶選擇不同的強度'。 – 2013-04-25 16:24:17