我是ruby on rails的新手,对 Rails 3 的性能和最佳实践有一个(可能很简单)的问题。我正在使用一个名为enki blog的博客引擎,我看到编写此博客引擎的人正在使用以下技术选择标签:
Tag.find(:all).reject {|tag| tag.taggings.empty? }.sort_by {|tag| tag.taggings_count }.reverse
我认为没有“.reject”的目的,因为每当创建,更新或销毁文章时都会删除空标签。假设我是对的,这会是一个更好的方法吗?
Tag.find(:all, :order => "taggings_count desc")
我正在寻找性能和可读性。深入挖掘模型结果的最佳方法是什么? “.sort_by”和传递之间是否有任何真正的区别:作为参数订购?
提前感谢您的任何答案。
答案 0 :(得分:2)
你是对的,这肯定是一些低效的代码。
sort_by和:order之间存在显着差异。 :order用于构建SQL语句,这意味着数据库在返回记录之前对其进行排序。 sort_by是一个Ruby方法,它重新排列数据库已经返回的记录。通常数据库会更快,所以用户:订单。
我不能说是否有必要拒绝。但是如果是,那么使用WHERE语句在数据库中再做它会更快。所以你会有
Tag.find(:all, :conditions => "taggings_count > 0", :order => "taggings_count desc")
在Rails 3中看起来像
Tag.where('taggings_count > 0').order('taggings_count desc')