有没有大神知道怎么实现的,我百思不得其解啊,我本来以为是 where 其实没有去数据库查询,在使用 first 或者 each 的时候才去查询的,但是好像不是这样子的。
可以简单理解大多是实话,执行 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 了。
where 方法返回的结果 ActiveRecord::Relation 而它是懒加载的,也就可以理解为通过 where 方法返回对象只是一个壳子,里面什么都没有,直到我们需要从这个对象中取得属性值这一刻才会真的查询数据库