在Rails应用程序中,我有三个模型(posts, Shop::Items和Directory::Items)。每个模型都与其他模型(用户、类别、城市……)有关系。所有这些信息我必须显示在主页上。它应该看起来像分页的项目列表。我使用postgres数据库。
我们可以在控制器中编写这样的代码:
@postings = Posting.includes(:category, :subcategory, :user, :city).all
@directory_items = Directory::Item.includes(:category, :user, :city).all
@shop_items = Shop::Item.includes(:category, :user, :city, :phone).all
并对结果进行排序。但这不是最好的办法。
第二个解决方案是编写不包含ActiveRecord的自定义查询。但是这个查询实在太大了,很难支持(这里有很多连接)
使用最少DB查询的最佳解决方案是什么?(这是主页,所以它应该工作得非常快)。
这里有一些解决方案并不快。
或者你可以使用sphinx + thinking sphinx gem。这样做既快又干净。
ThinkingSphinx.search classes: [Posting, Shop::Items, Directory::Items], page: params[:page] || 1, per_page: 10
由于查询将被缓存,因此只有排序将花费时间。如果您不显示太多的项目,开发人员的可读性远远超过了优化的成本。如果性能确实是一个瓶颈,您总是可以做得更好,但是您仍然可以选择使此代码过于复杂。