【问题标题】:Working with Ruby on Rails Models使用 Ruby on Rails 模型
【发布时间】:2011-06-21 01:43:32
【问题描述】:

我是 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”和传递 :order 作为参数之间有什么真正的区别吗?

提前感谢您的任何回答。

【问题讨论】:

  • 你在使用 rails3 吗?如果我没记错的话,带有附加参数的find(例如:order)已被弃用。我建议Tag.order("taggings_count desc") 更干净:)
  • 是的,我正在使用 rails 3. Tag.order("taggings_count desc") 和 Tag.find(:all, :order => "taggings_count desc") 做同样的事情?它是否隐式选择全部?如果是这样,.order 是否具有与参数化版本相同的性能水平?
  • 它将在 Rails 3.1 中被弃用。没有理由在新项目中使用旧式语法。如果您好奇,我建议您观看the railscast 以了解差异。
  • 更好地观看@Semyon Perepelitsa 的 railscast 链接。简而言之,find 减少到只有 1 个参数,可能是 :all / :first / :last / ID。这些条件是单独的方法(where / order / join etc 返回 ActiveRelation(在实际使用记录之前不查询数据库,例如调用 .all / .first etc)。

标签: ruby-on-rails ruby models


【解决方案1】:

你是对的,那绝对是一些低效的代码。

sort_by 和 :order 之间存在显着差异。 :order 用于构建 SQL 语句,这意味着数据库在返回记录之前对记录进行排序。 sort_by 是一个 Ruby 方法,它重新排列数据库已经返回的记录。一般来说,数据库会快得多,所以用户:order。

我不能说是否有必要拒绝。但如果它,那么在数据库中使用 WHERE 语句执行此操作会快得多。所以你会有

Tag.find(:all, :conditions => "taggings_count > 0", :order => "taggings_count desc")

在 Rails 3 中看起来像

Tag.where('taggings_count > 0').order('taggings_count desc')

【讨论】:

  • 感谢您的回答。这很有帮助,但我忘了提到我正在使用 Rails 3。 :order 作为参数是否已被弃用,正如我上面的评论者所说的那样?我将编辑我的帖子以提及我正在使用 rails 3。
  • 如果你使用旧语法,条件在:conditions => {}hash中指定
  • 哦,我不小心创建了 Rails 2 和 3 样式的奇怪合成。从 Rails 3 开始,它看起来像 Tag.where('taggings_count > 0').order('taggings_count desc')
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多