如何将变量分配给activerecord对象?

时间:2013-04-18 20:20:07

标签: ruby-on-rails ruby activerecord

以下代码将使用ST_AsGeoJSON postgis函数查询我的数据库,并在rails控制台中将json对象打印到屏幕上。

Zcta.
  select("ST_AsGeoJSON(ST_simplify(geom,500)) as my_geo").
  where(geoid10: '90210').each do |result|
    puts result.my_geo
  end

如果我想将该内容放入变量(或数组或哈希)中,该怎么办?如果我将puts result.my_geo更改为variable = result.my_geo然后尝试使用该变量,则会收到错误消息,指出该变量不存在。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您是否在块中定义了变量?然后它将无法在外面访问。 首先在块外部定义变量。

答案 1 :(得分:2)

或者改为使用map

variable = Zcta.
  select("ST_AsGeoJSON(ST_simplify(geom,500)) as my_geo").
  where(geoid10: '90210').map do |result|
    result.my_geo
  end

答案 2 :(得分:2)

您正在寻找map而不是each

each将遍历Enumerable中的每个项目并为其执行块,返回nil。在您的示例中,puts将对象打印到控制台,但不将其存储在任何位置。

另一方面,

map将为枚举的每个元素执行块,并返回一个 new 枚举,其中包含在每个元素上运行给定块的结果。< / p>

x = [1,2,3].map { |elem| elem + 1 }
puts x
[2,3,4]

在您的情况下,您可以执行以下操作:

result = Zcta.select("ST_AsGeoJSON(ST_simplify(geom,500)) as my_geo")
  .where(geoid10: '90210')
  .map(&:my_geo)

您的查询结果现在将作为Enumerable存储在变量result