Rails ActiveRecord.all 的返回值是什么?

shaunli · 2015年03月09日 · 最后由 shaunli 回复于 2015年03月09日 · 1670 次阅读

在文档里没找到,所以问问大家

数据库里保存了 3 条 HouseType 记录:

id |   name   | description | area | amount |         created_at         |         updated_at         | meta
----+----------+-------------+------+--------+----------------------------+----------------------------+------
  1 | 午-A     | 2室2厅1卫   |   90 |    900 | 2015-03-09 02:15:04.751217 | 2015-03-09 02:15:04.751217 |    2
  2 | 午-A(反) | 2室2厅1卫   |   90 |    900 | 2015-03-09 02:15:04.753087 | 2015-03-09 02:15:04.753087 |    2
  3 | 丑-B     | 3室2厅1卫   |  140 |    300 | 2015-03-09 02:15:04.754353 | 2015-03-09 02:15:04.754353 |    3

在 Controller 中取出所有 house_type:

@house_types = HouseType.all

在 View 中打印@house_types,得到的结果是这样的:

{
  2 => [
    #<HouseType id: 1, name: "午-A", description: "2室2厅1卫", area: 90, amount: 900, created_at: "2015-03-09 02:15:04", updated_at: "2015-03-09 02:15:04", meta: 2>, 
    #<HouseType id: 2, name: "午-A(反)", description: "2室2厅1卫", area: 90, amount: 900, created_at: "2015-03-09 02:15:04", updated_at: "2015-03-09 02:15:04", meta: 2>
  ], 
  3 => [
   #<HouseType id: 3, name: "丑-B", description: "3室2厅1卫", area: 140, amount: 300, created_at: "2015-03-09 02:15:04", updated_at: "2015-03-09 02:15:04", meta: 3>
  ]
}

可以看出,是个 hash,有两个 pair,第一个 pair 的 key 是 2,value 是保存了前两个 HouseType 数据的 array;第二个 pair 的 key 是 3,value 是保存了剩下一个 HouseType 数据

我有点迷惑:为什么不是直接返回一个包含所有 HouseType 的 array,而是返回这样一个奇怪的 hash 呢?还有,返回的 hash 中的 key 是什么意思?

返回值是一个 ActiveRecord::Relation,看起来像 Array

如果返回 Array,那么 HouseType.all 会立刻去数据库中查询

如果返回 ActiveRecord::Relation,那么在页面呈现时,才去数据库中查询

而且,ActiveRecord::Relation 能链式操作,如 HouseType.all.order(:created_at => :desc)

当然,你也可以将 ActiveRecord::Relation 转化为 Array,如 HouseType.all.to_a

#1 楼 @libuchao 我知道为什么了,是我犯 2 了,刚才突然发现代码版本弄错了。 谢谢你对返回值的解释,又学到了一些:D

需要 登录 后方可回复, 如果你还没有账号请 注册新账号