从采摘好的阵列

时间:2014-09-10 13:52:01

标签: ruby-on-rails ruby

我有一个模特,我喜欢我可以使用的采摘方法。如果我这样做:

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

然后我得到一个多维数组:@x [] []。凭借我悲伤的技巧,我使用数字与他们合作:

@x[0][1]

如何使用pluck或类似的方法来访问数组:

@x[0][:column_two]

3 个答案:

答案 0 :(得分:4)

如果您担心从数据库中获取内容的结构,您应该这样做:

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

然后,您保持快速数据库查询优势+拥有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]

答案 1 :(得分: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}, {...}, ... ]

答案 2 :(得分: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