新手问题 ActiveRecord::Relation 到底用了什么魔法,为什么可以链式而不反复查询

ad583255925 · 2017年03月07日 · 最后由 huacnlee 回复于 2017年03月07日 · 943 次阅读

有没有大神知道怎么实现的,我百思不得其解啊,我本来以为是where其实没有去数据库查询,在使用first或者each的时候才去查询的,但是好像不是这样子的。

共收到 10 条回复

可以简单理解大多是实话,执行 SQL 是 to_a 的方法里面做的

http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-to_a

例如:

@topics = Topic.limit(10)

这个时候,@topics 还处于 ActiveRecord::Relation 状态,但我们一般可能会尝试 map 它,于是将会调用到 .to_a 的方法

<% @topics.each do |t| %>
  <h1><%= t.title %></h1>
<% end %>

当然,还有一些其他的动作可能会触发执行 SQL,在 ActiveRecord::Relation 实例里面有 loaded 的状态字段用于记录是否已经执行 SQL 了。

huacnlee 回复

我把mysql服务关了,limit(10)会报错的啊

ad583255925 回复

什么错?数据库连接错吧

你看 API 文档都写清楚了的呀

huacnlee 回复

你的意思是limit(10)的时候没有去数据库取数据吗?

where方法返回的结果ActiveRecord::Relation而它是懒加载的,也就可以理解为通过where方法返回对象只是一个壳子,里面什么都没有,直到我们需要从这个对象中取得属性值这一刻才会真的查询数据库

easonlovewan 回复

原来亮点就在于 def inspect to_a.inspect end 我感觉我离真相越来越近了

一直被控制台输出骗了,原来我理解的没错哈哈。。

@huacnlee wiki现在是不可以访问了吗?提示没有权限或是没有登录

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