0

Comment在查询我的Activity表时,我试图预先加载s。

# Activity (basic FB-style news feed)
#   user_id
#   primary_source_id (polymorphic object, like "Post", that can have comments)
#   primary_source_type

# Comment (acts as commentable w/ threading gem)
#   user_id
#   commentable_id
#   commentable_type

# WHAT GOES HERE?!
# How do I eager-load comments?
activities = Activity.includes(???).joins(???)

# Display code
activities.each do |activity|
  render ... # render activity
  activity.root_comments.each do |comment|
    render ... # render activity's comments
  end
end

看,我通过遍历Activitys 并抓取每个primary_source(如 a Post)及其Comments 来呈现我的页面。现在sprimary_source正在被急切加载,但Comments 不是;每个循环都打到Comment桌子上。Activity这对我来说是一个巨大的性能冲击,它与我展示的 s 数量成线性关系。

如何急切加载我Comment的 s?

4

1 回答 1

3

假设您所有的 primary_sources 都是可评论的,

activities = Activity.includes(:user, :primary_source => :comment_threads).where...

...为我工作。为了避免访问数据库(并破坏包含的目的),您必须将任何对 root_comments 的引用替换为 comment_threads (其中确实包括子评论)。这是因为 root_comments 实际上在 gem (lib/acts_as_commentable_with_threading.rb) 中定义为辅助方法:

def root_comments
  self.comment_threads.where(:parent_id => nil)
end

资料来源:关于嵌套关联的Rails 指南部分,以及在acts_as_commentable_with_threading gem 内部的窥视以及控制台中的一些试验和错误:)

于 2012-05-29T21:38:51.680 回答