2014-09-10 45 views
1

我有一個模型,我喜歡我可以使用的採摘方法。如果我這樣做:漂亮的陣列從採摘

@x = AwesomeModel.all.pluck(:column_one, :column_two) 

然後我得到一個多維數組:@x [] []。隨着我傷心的技能,我和他們使用的數字工作:

@x[0][1] 

我如何可以用拔毛或類似的方法來訪問數組是這樣的:

@x[0][:column_two] 
+0

什麼版本的紅寶石? '.to_h'可用於在Ruby 2.1中轉換爲哈希。 – pdobb 2014-09-10 13:55:32

+0

版本2.0.0 - 太糟糕我有Rails在多個平臺上運行,不能真正負擔打破我的平臺... – MiningSam 2014-09-10 16:47:50

回答

4

如果您擔心你從數據庫得到的是什麼結構,你應該簡單地做:

@x = AwesomeModel.all.select(:column_one, :column_two) 

然後你會保持快速DB查詢優勢+具有AwesomeModel的情況下,但只有column_onecolumn_two充滿


或者,如果你想要做手工:

@x = AwesomeModel.all.pluck(:column_one, :column_two).map do |array| 
    OpenStruct.new({column_one: array[0], column_two: array[1] }) } 
end 

然後你可以使用它像一個普通的模型:

@x[0].column_one 
# or even 
@x[0][:column_two] 
+0

真棒,謝謝! – MiningSam 2014-09-10 16:49:45

2

你可以做

class ActiveRecord::Base 
    def self.pluck_hash(*args) 
    plucked = pluck(*args) 
    plucked.map {|ary| Hash[args.zip ary]} 
    end 
end 

AwesomeModel.all.pluck_hash(:column_one, :column_two) 
#=> [{:column_one => 'value', :column_two => 'value}, {...}, ... ] 
1

冷杉所有的,不要使用.all.pluck,因爲它返回一個值的數組,並且這會讓你失去ActiveRecord::Relation的所有優點。

而是使用AwsomeModel.method直接,它會創建查詢,但不運行它,直到你需要它,AwsomeModel.select(:column_1, :column_2)將創建一個

select (awesome_models.column_1, awsome_models.column_2) 

查詢,其結果將是ActiveRecord::Relation對象,這仍是一個數組可鏈接,和值仍在列名例如鍵:

AwsomeModel.select(:column_1, :column_2).first.column_1 

而不是

AwesomeModel.all.pluck(:column_1, :column_2).first[0] # or .first.first 
+0

有沒有一個參考,我可以找到那些ActiveRecord ::關係優勢?現在我正在使用Rails來生成模型。我很想更多地瞭解它,而不是腳手架功能。 – MiningSam 2014-09-10 16:52:44

+0

因爲rails 4返回關係而不是數組,所以'all'方法。 – BroiSatse 2014-09-10 17:44:12

+0

我知道,但'pluck'把它變成一個數組 – 2014-09-10 17:45:08