我有一个模特,我喜欢我可以使用的采摘方法。如果我这样做:
@x = AwesomeModel.all.pluck(:column_one, :column_two)
然后我得到一个多维数组:@x [] []。凭借我悲伤的技巧,我使用数字与他们合作:
@x[0][1]
如何使用pluck或类似的方法来访问数组:
@x[0][:column_two]
答案 0 :(得分:4)
如果您担心从数据库中获取内容的结构,您应该这样做:
@x = AwesomeModel.all.select(:column_one, :column_two)
然后,您保持快速数据库查询优势+拥有AwesomeModel
个实例,但仅填充column_one
和column_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