【问题标题】:ROR - Active record avoid n+1 queriesROR - 活动记录避免 n+1 查询
【发布时间】:2019-03-16 09:11:35
【问题描述】:

我有一个模型(新闻)与另一个模型(类别)相关联,所以在新闻模型中我有:

has_and_belong_to_many :news_categories, join:table: 'news_categories_news'

我想把所有新闻都有自己的类别,所以:

News.find(/*conditions*/).includes(:news_categories)

如果我在控制台中签入,我会看到正确的内部连接查询,但是当我调用时

@news.news_categories

(其中 news 是结果数组中的单个新闻)如果我在控制台中查看另一个查询来获取当前新闻的类别,我该如何避免这种冗余查询?

ps:对不起我的英语......

【问题讨论】:

  • 试试News.includes(:news_categories).find(/*conditions*/)

标签: ruby-on-rails ruby join activerecord


【解决方案1】:

首先,.includes 在.find 之后链接时无法工作。原因 - find 将不会返回ActiveRecord::Relation,这是关系链接所必需的;它宁愿返回匹配的News 对象或错误。

你应该这样做:

@all_news = News.includes(:news_categories).where(id: 1)
@news = @all_news.first
@news.news_categories # shouldn't invoke new query

【讨论】:

    【解决方案2】:

    谢谢大家,但我用eager_load()解决了 它只生成一次查询!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多