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