我一直在看Rails文檔,找不到這個。列表模型的領域在軌道
可以說我有一個型號User
字段strength
。
如何獲取陣列中每個模型對象實例的所有strength
的列表?
list_of_str = [1,2,3,4,等等。]
我知道,你可以打電話User.all
,並通過他們的每一個強度的領域的迭代,並將它們添加到列表中,但有一個更優雅這樣做的方式?
我一直在看Rails文檔,找不到這個。列表模型的領域在軌道
可以說我有一個型號User
字段strength
。
如何獲取陣列中每個模型對象實例的所有strength
的列表?
list_of_str = [1,2,3,4,等等。]
我知道,你可以打電話User.all
,並通過他們的每一個強度的領域的迭代,並將它們添加到列表中,但有一個更優雅這樣做的方式?
User.pluck 'strength'
新的軌道3.2如果我的記憶是正確的
您可以使用
User.uniq.pluck 'strength'
如果你需要避免重複,你也可以用範圍和條件,結合這一點,例如
User.where(...).pluck 'strength'
絕對是這樣做的正確方法 - 不會對數據庫施加不必要的負載,不會實例化一堆ORM對象,只需運行'select users.strength from users'並將輸出轉換爲簡單的字符串數組。 – bdares 2013-04-25 06:41:23
您可以使用'User.uniq.pluck:strength'來避免重複。 – 2013-04-25 07:05:42
好的呼叫斯文! – 2013-04-25 08:27:52
可以使用該選擇方法時,它產生其中檢索只有所需的字段的值的查詢(其不是加載從數據庫中的所有模型數據更快):
User.select(:strength)
這仍然返回模型對象的數組,所以你必須使用地圖,僅保留值的數組:
User.select(:strength).map(&:strength)
模型對象的創建將不僅僅是查詢數據庫的價值觀慢,但使用如果性能不重要,應避免使用原始SQL 在這個地方。
編輯:還有一種更好的方法(pluck
),請參閱接受的答案。
如果你真的在不同strength
之後:
User.select('distinct strength').pluck(:strength)
會得到它們。如果你不關心重複的話,那麼Frederick Cheung的簡單的pluck
將是一個好主意。
太棒了!不知道'拔'。但我認爲'User.uniq.pluck(:strength)'不會創建重複內容,並且不會強制您將字符串作爲外部SQL傳遞。 – 2013-04-25 07:04:16
@SvenKoschnicke:確實,'.uniq.pluck'最終會做一個簡單的'從用戶選擇不同的強度'。 – 2013-04-25 16:24:17
你在尋找什麼樣的優雅?你可以通過'User.all.map(&:strength)'得到所有'強化'的數組。它是優雅的方式嗎? :) – 2013-04-25 06:22:44