Rails:如何缓冲ActiveRecord查询?

3
我希望保存一个查询,然后在其基础上构建并执行它。
例如,可以这样实现:
query = Post.order('likes DESC') # buffer the query
query = query.limit(3) # add on top of it
query.run # run it - this is the wrong syntax fyi

这个能做到吗?正确的语法是什么?

附注:如果“buffer”不是正确的词,请纠正我。

谢谢!

4个回答

4
在Rails 3中使用ActiveRecord构建查询时,不需要任何“缓冲区”,因为它使用Arel。您的query = Post.order('likes DESC')会给您一个ActiveRecord :: Relation实例。这个对象包含有关查询的信息,但不包含实际数据。例如,要获取数据,您可以调用.first.all方法。这是Rails框架(> = 3.0)实现所谓的“惰性初始化”的方式。这意味着ActiveRecord :: Relation是一种代理。只有当您尝试获取模型的某些字段(或者当您使用.all,.first.last等强制加载数据时),才会真正查询数据库。在此操作之前,您可以构建过滤条件链,并确信您不会“干扰”数据库。 您的代码可能如下所示:
query = Post.order('likes DESC') # ActiveRecord::Relation object with info about your query
query = query.limit(3) # adds more filtering options
@posts = query.all # here ActiveRecord takes data from the database

#239 ActiveRecord::Relation Walkthrough 将帮助您更好地理解 ActiveRecord::Relation 相关知识。


我在控制台上看到的行为与你所说的一致,除了最后一部分query.all。对我来说,.all返回的是之前设置的条件无论如何都返回所有内容。 - Jason Swett
1
除了.first.last等会导致记录加载外,您还可以显式调用.load。http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-load - Lee

3
如果您正在使用AREL和Rails 3,则这将自动发生。当您链接选项时,AREL将构建查询,并在调用.all或通过任何其他方式开始访问数据时执行查询。

2
这正是ActiveRecord的工作方式。当它遇到迭代器或其他非AR方法时,它会使用已构建的查询调用数据库。在控制台中,它的工作方式有些不同,因为我相信在按回车键后显示输出之前会调用.inspect方法。
你提出的做法是可以的。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接