假设我有一个帖子和类别模型,每个帖子都属于一个类别。在几乎每一页上,我都会得到类别列表:
@categories = Category.all
这会生成一个Category对象数组。现在,假设每个类别都有id和name属性。查看帖子时,我想显示类别名称。
我最初通过这样的方式得到了类别名称:
@post = Post.find(params[:id], :include => :category)
但是,我意识到我已经有了@categories数组。似乎没有必要:当我已经有一个类别列表时包含。所以,相反,我现在正在对阵列执行查找:
category = @categories.find { |category| @post.category_id == category.id }.name
这可以减少查询次数。我的问题是,这是否是解决减少查询数量的最佳方法(没有缓存)?
答案 0 :(得分:2)
这是非常明智的。
唯一的风险(这是一个微不足道的风险)是你可能会受到竞争条件的影响。例如,有人可以在您提取类别列表后更改帖子的类别,或者他们可以更新类别列表,并且您显示的内容将不再正确。随后,如果他们点击类别名称以获取该类别的所有帖子的列表,他们可能会收到错误,除非您处理这类事情。
然而,IMO,这是一个非常小的代价。答案 1 :(得分:1)
此处唯一的问题是当您决定不再需要类别列表并尝试删除它时。
否则你得到了一个很好的解决方案。
答案 2 :(得分:0)
如果你有大量的类别怎么办?你还要把它们全部拿走吗?做一个:include
要好得多,因为SQL总会赢得Ruby。