显然我在这里遗漏了一些明显的东西,但我会很感激一个简单的例子。
我从ActiveRecord回来了一条记录,我从查询中选择了几列。这些字段是BigDecimal格式,需要展平为字符串。
我最初认为用以下内容提取查询就足够了:
rows = ModelName.order("date DESC").select('table_name.precise_number1, table_name.precise_number2').limit(100).all.zip
rows_stringified1 = Array.new
rows_stringified2 = Array.new
readings.each do |row|
rows_stringified1.push row[:precise_number1].to_s
rows_stringified2.push row[:precise_number2].to_s
end
然而,这会产生错误,例如can't convert Symbol into Integer
。显然,我没有完全遵循如何从行集结果中的记录访问列。
你通常会这样做吗?
答案 0 :(得分:2)
据推测,你有一个错字,而你正在这样做:
readings = ModelName.order("date DESC").
select('table_name.precise_number1, table_name.precise_number2').
limit(100).
all.
zip
而不是分配给rows
。最后注意到zip
?这没有任何意义。当你这样做时:
[a, b, c].zip
你明白了:
[[a], [b], [c]]
因此,在readings.each
块中,row
实际上是[model]
,而不是您认为的model
,这意味着row[:precise_number1]
尝试使用符号row
而不是数组期望的整数来访问数组 :precise_number1
,因此您的“无法将符号转换为整数”错误。
所以要么摆脱zip
并将each
保留原样:
readings = ModelName.order("date DESC").
select('table_name.precise_number1, table_name.precise_number2').
limit(100).
all
# ...
readings.each do |row|
rows_stringified1.push row[:precise_number1].to_s
rows_stringified2.push row[:precise_number2].to_s
end
或保留zip
并调整each
块以匹配row
的真实情况:
readings = ModelName.order("date DESC").
select('table_name.precise_number1, table_name.precise_number2').
limit(100).
all.
zip
# ...
readings.each do |row|
rows_stringified1.push row.first[:precise_number1].to_s
rows_stringified2.push row.first[:precise_number2].to_s
end
我建议删除zip
,因为它没有任何用处,只会让事情混淆。