在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
ActiveRecord::Relation是rails3中添加的。rails2中的finders, named_scope, with_scope 等用法,在rails3统一为一种Relation用法。 以下是返回ActiveRecord::Relation的方法: bind create_with distinct eager_load extending from group having includes joins limit lock none offset order preload readonly references reorder reverse_order select uniq where
主要有以下优势: 一,实验验证惰性加载: p1 = Post.all p2 = Post.order(:id) p1.class #=> Array p2.class #=> ActiveRecord::Relation 然后等待一会儿,去数据库中,将"old_name"改为"new_name"。这样的话,因为Post.all是立即加载数据,Post.order(:id)是惰性加载数据,所以改了 title之后,p1和p2的值应该是不相同的。 p1[0] => #<Post id: 1, title: "old_name", created_at: "2014-05-08 00:45:27", updated_at: "2014-05-08 00:45:27"> p2[0] => #<Post id: 1, title: "old_name", created_at: "2014-05-08 00:45:27", updated_at: "2014-05-08 00:45:27">
发现p1和p2的结果是相同的,Post.order(:id)并没有惰性加载数据,为什么呢? 原因是在rails的控制台中,会打印出语句的返回结果,也就使用了这些数据,所以这么修改p1和p2两行为: p1 = Post.all;nil
p2 = Post.order(:id);nil
这样重新执行上边的流程,结果如下: p1[0] => #<Post id: 1, title: "old_name", created_at: "2014-05-08 00:45:27", updated_at: "2014-05-08 00:45:27"> p2[0] => #<Post id: 1, title: "new_name", created_at: "2014-05-08 00:45:27", updated_at: "2014-05-08 00:45:27">
实验验证链式操作: def inspect to_a.inspect end
p2.inspoect => "[#<Post id: 1, title: \"new_name\", created_at: \"2014-05-08 00:45:27\", updated_at: \"2014-05-08 00:45:27\">]" 将inspect方法注释掉,然后看Relation实例中的内容 "#<ActiveRecord::Relation:0x463cbf0 可以看出Relation对象中根本就没有存储数据库中的内容,因为使用了order(:id)方法,所以@order_values=[:id]存储了查询信息。 每一次链式操作都会在Relation中添加对应的查询条件,在使用的时候才去生成SQL语句,查询数据库。
总结: 知道了ActiveRecord::Relation的内部组织结构就非常好理解惰性加载和链式操作了,Relation让数据库操作更加优雅! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论