2014-09-10 43 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