【发布时间】:2014-03-01 20:22:19
【问题描述】:
我有一个 HAML 部分呈现为集合的一部分,它本身呈现两个其他部分。集合可能有 1000 长。它使用 group by 和 #map 和 #reject 的复杂查询。如何加快渲染速度? 100 已经花费了大约 6 秒。我已经尝试在顶部查询中使用 .includes(:relation) 但它没有帮助。尽管包括.includes(:votes, :comments, :taggings, :tags),并运行SELECT "votes".* FROM "votes" WHERE "votes"."post_id" IN (124, 123,...,它仍然尝试加载单个关系Vote Load (0.0ms) SELECT "votes".* FROM "votes" WHERE "votes"."post_id" = $1 AND "votes"."user_id" = 1。我想 ActiveRecord 不使用像 Coherence 这样的关系对象缓存(这很好,因为这很困难)。
(顺便说一句,我如何提取部分中几行的复杂查询代码?中间部分没有控制器。我担心如果我添加移动模板,我会有复制复杂的查询并保持同步,这无疑会失败。)
这是调用的布局
-- User
-- SQL: @user.posts.order(:created_at => :desc).limit(1000)
-- Post
-- SQL, Votes, post.votes.where(user_id: current_user.id)
-- SQL, Comments, post.comments.count
-- SQL, Tags, post.taggings.select("tag_id, count(*) as count").group("tag_id").order(count: :desc).limit(3).includes(:tag)
-- SQL, Comments... about the same as above
这个博客几乎完全描述了我遇到的同样的问题!但是,他们使用:finder_sql,当我尝试使用它时,Rails 抱怨说它已被弃用并查看范围。范围似乎没有任何帮助。它们很简洁,但它们只限制查询,而不是在一个查询中加载附加信息。
http://coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/75
【问题讨论】:
-
您是说您的复杂查询代码在部分内部吗?这不应该在模型中吗?速度问题与渲染有关还是与查询有关?需要看一个更具体的例子才能知道问题出在哪里。
-
听起来您可能正在查询和实例化很多模型,这很昂贵,我建议您使用 SQL 即子查询来仅查找您想要的模型。
-
@riley 好的,我展开循环并将部分包含到主要的
show.haml中,并将查询移到模型中,但我认为这不是问题所在。它似乎没有帮助。我认为问题出在 SQL 上,它会为 1000 个帖子中的每一个获取附加信息。我会用布局更新问题。 -
@riley 出于某种原因,我认为 SQL 应该进入控制器。通常我喜欢我的模型非常简单。不知道为什么我没有想到将 SQL 放入模型中。
-
从控制器粘贴此操作的代码。
标签: ruby-on-rails performance ruby-on-rails-4 haml