【问题标题】:Why does my JOIN still trigger n+1 selects in active record?为什么我的 JOIN 仍然会触发活动记录中的 n+1 选择?
【发布时间】:2011-09-30 20:29:56
【问题描述】:

PortfolioEngine::Portfolio Load (0.3ms) SELECT "portfolio_engine_portfolios".* FROM "portfolio_engine_portfolios" INNER JOIN "portfolio_engine_items" ON "portfolio_engine_items"."portfolio_id" = "portfolio_engine_portfolios"."id" ORDER BY portfolio_engine_portfolios.sort_index ASC, portfolio_engine_portfolios.sort_index ASC,portfolio_engine_items.sort_index ASC

PortfolioEngine::Item Load (0.2ms) SELECT "portfolio_engine_items".* FROM "portfolio_engine_items" WHERE "portfolio_engine_items"."portfolio_id" = 2 ORDER BY portfolio_engine_items.sort_index ASC, sort_index asc

PortfolioEngine::Item Load (0.3ms) SELECT "portfolio_engine_items".* FROM "portfolio_engine_items" WHERE "portfolio_engine_items"."portfolio_id" = 3 ORDER BY portfolio_engine_items.sort_index ASC, sort_index asc

PortfolioEngine::Item Load (0.2ms) SELECT "portfolio_engine_items".* FROM "portfolio_engine_items" WHERE "portfolio_engine_items"."portfolio_id" = 1 ORDER BY portfolio_engine_items.sort_index ASC, sort_index asc

n+1 是通过循环遍历每个投资组合的项目来触发的。

class Portfolio < ActiveRecord::Base
  has_many :items,
         order: "portfolio_engine_items.sort_index asc",
         autosave: true,
         inverse_of: :portfolio
  default_scope :order => 'portfolio_engine_portfolios.sort_index ASC'
end

class Item < ActiveRecord::Base
  belongs_to :portfolio
  belongs_to :client
  has_many :images,
           order: "sort_index ASC",
           autosave: true,
           inverse_of: :item
end

我不知道为什么会这样......

@portfolios = PortfolioEngine::Portfolio.
    joins(:items).
    order("portfolio_engine_portfolios.sort_index ASC, portfolio_engine_items.sort_index ASC").
    all

【问题讨论】:

    标签: activerecord


    【解决方案1】:

    您是否尝试过includes 而不是joins

    【讨论】:

    • 啊,所以连接用于复杂查询以获取更远的值,而包含用于实际获取实体。知道了。谢谢!
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 2021-03-31
    • 2012-11-28
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多