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

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

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

你通常会怎么做?

大概你有一个拼写错误,你这样做:

 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]正在尝试使用Symbol :precise_number1而不是数组期望的整数,因此您的“无法将符号转换为整数”错误。

所以要么摆脱zip并保持原样:

 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因为它没有任何用处,只是混淆了一些东西。