Rails:删除不必要的数据库查询

时间:2009-08-25 23:54:49

标签: ruby-on-rails

假设我有一个帖子和类别模型,每个帖子都属于一个类别。在几乎每一页上,我都会得到类别列表:

@categories = Category.all

这会生成一个Category对象数组。现在,假设每个类别都有id和name属性。查看帖子时,我想显示类别名称。

我最初通过这样的方式得到了类别名称:

@post = Post.find(params[:id], :include => :category)

但是,我意识到我已经有了@categories数组。似乎没有必要:当我已经有一个类别列表时包含。所以,相反,我现在正在对阵列执行查找:

category = @categories.find { |category| @post.category_id == category.id }.name

这可以减少查询次数。我的问题是,这是否是解决减少查询数量的最佳方法(没有缓存)?

3 个答案:

答案 0 :(得分:2)

这是非常明智的。

唯一的风险(这是一个微不足道的风险)是你可能会受到竞争条件的影响。例如,有人可以在您提取类别列表后更改帖子的类别,或者他们可以更新类别列表,并且您显示的内容将不再正确。随后,如果他们点击类别名称以获取该类别的所有帖子的列表,他们可能会收到错误,除非您处理这类事情。

然而,IMO,这是一个非常小的代价。

答案 1 :(得分:1)

此处唯一的问题是当您决定不再需要类别列表并尝试删除它时。

否则你得到了一个很好的解决方案。

答案 2 :(得分:0)

如果你有大量的类别怎么办?你还要把它们全部拿走吗?做一个:include要好得多,因为SQL总会赢得Ruby。