ruby-on-rails - 删除印象派宝石的 N+1 个查询
问题描述
在我的 Rails 应用程序中,我遇到了 N+1 问题,我需要对数据库进行额外调用以一遍又一遍地获取相关数据,特别是在记录每个模型的印象数时。
例如:
Started GET "/" for 127.0.0.1 at 2018-12-02 16:21:05 -0500
Processing by JobsController#index as HTML
Job Load (4.4ms) SELECT "jobs".* FROM "jobs" WHERE "jobs"."published_at" IS NOT NULL ORDER BY "jobs"."published_at" DESC LIMIT $1 OFFSET $2 [["LIMIT", 30], ["OFFSET", 0]]
↳ app/controllers/jobs_controller.rb:22
User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 13], ["LIMIT", 1]]
↳ app/controllers/jobs_controller.rb:24
Impression Exists (1.3ms) SELECT 1 AS one FROM "impressions" WHERE "impressions"."impressionable_id" = $1 AND "impressions"."impressionable_type" = $2 AND "impressions"."session_hash" = $3 LIMIT $4 [["impressionable_id", 705], ["impressionable_type", "Job"], ["session_hash", "d80d52dd401011a626d600167140e49f"], ["LIMIT", 1]]
↳ app/controllers/jobs_controller.rb:24
Impression Exists (0.6ms) SELECT 1 AS one FROM "impressions" WHERE "impressions"."impressionable_id" = $1 AND "impressions"."impressionable_type" = $2 AND "impressions"."session_hash" = $3 LIMIT $4 [["impressionable_id", 704], ["impressionable_type", "Job"], ["session_hash", "d80d52dd401011a626d600167140e49f"], ["LIMIT", 1]]
↳ app/controllers/jobs_controller.rb:24
Impression Exists (0.4ms) SELECT 1 AS one FROM "impressions" WHERE "impressions"."impressionable_id" = $1 AND "impressions"."impressionable_type" = $2 AND "impressions"."session_hash" = $3 LIMIT $4 [["impressionable_id", 703], ["impressionable_type", "Job"], ["session_hash", "d80d52dd401011a626d600167140e49f"], ["LIMIT", 1]]
↳ app/controllers/jobs_controller.rb:24
我正在使用印象派宝石并impressionist
直接使用该方法,获取Jobs
页面上的所有内容并记录印象。问题是因为我只记录独特的印象,对于已经有的记录impression
,这些额外的调用是多余的。我试图用它@jobs.includes(:impressions).each
来预加载相关数据,希望 Rails 足够聪明,可以找出存在哪些记录,但 Rails 仍然会输出大量Impression Exists
查询。
@jobs.each{|job| impressionist(job,'', :unique => [:session_hash])}
解决方案
推荐阅读
- javascript - div innerHTML 未更新
- pimcore - Pimcore 6 CSV 导入
- latex - 如何使文档标题变粗并变大?
- java - Whitelabel 错误页面,而不是缺少必需的参数
- python - 在 pythong/asyncio 中同时运行协程无法正常工作
- spring - Spring Boot @Async 方法的异常处理
- ios - 图像裁剪之外的 react-native-perspective-image-cropper 在 IOS 中添加白色背景
- javascript - Vue 在下拉更新中观察多个绑定的变化
- excel - 通过 office.js 将 OMML 公式插入 Excel 工作表
- javascript - 使用 Javascript 对选择框进行排序