如何通过ActiveRecord行结果中的属性名称访问字段?

时间:2012-01-09 00:21:54

标签: ruby-on-rails ruby ruby-on-rails-3

显然我在这里遗漏了一些明显的东西,但我会很感激一个简单的例子。

我从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。显然,我没有完全遵循如何从行集结果中的记录访问列。

你通常会这样做吗?

1 个答案:

答案 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,因为它没有任何用处,只会让事情混淆。