Rails 3 + Paperclip: N+1 查询

3

所以,我在我的Rails 3应用程序中使用Bullet gem来尝试捕捉N+1查询。但是,我遇到了一个无法解决的查询问题。

这里是Bullet的提示信息:

N+1 Query detected
  User => [:profile]
  Add to your finder: :include => [:profile]
N+1 Query method call stack
  .../app/models/user.rb:38:in `full_name'
  .../config/initializers/paperclip.rb:14:in `block in <top (required)>'
  .../app/views/photos/_photo_tiles.html.haml:4:in `_app_views_photos__photo_tiles_html_haml__787318603078146010_2192645460_1634077202131545355'
  .../app/views/photos/index.html.haml:30:in `_app_views_photos_index_html_haml___2562222078013468078_2155167020__3275303796392914006'

不过,这样做并没有太多意义,因为每个用户都需要提取其个人资料数据,所以我的用户模型中包含了这些信息:

# SCOPES
default_scope includes(:profile)

# DELEGATES
delegate :first_name, :last_name, :full_name,
         :to => :profile

因此,我总是将用户的资料与文件一起拉取。问题似乎源于在paperclip初始化器中找到的用户完整名称包含在其上传文件的文件名中:

Paperclip.interpolates :username do |attachment, style|
  attachment.instance.user.full_name.dehumanize
end

所以,对于调用user.full_name的操作将被传递到user.profile - 但是profile已经包含在其中了!

那么,有什么想法可以消除这个N+1查询吗?

谢谢!


用户和附件是如何被找到的?我认为你需要查看的查询就是这个,attachment.instance.user已经被实例化了。它是使用查找器或其他可能不使用默认范围的东西找到的吗? - hornairs
嗯,我想那是一个纸夹的事情。在初始化器中没有其他设置该查询的代码,它是一个独立的方法。了解Paperclip工作原理以可能推断出一种修复方法吗? - Andrew
1个回答

0

你确定这是N+1查询的真实例子而不是Bullet的一个错误吗?也许它被整个default_scope+delegate的事情搞糊涂了。

你有在script/console development中运行相关方法,同时在另一个终端中输入tail -f log/development.log来查看哪些查询正在执行,并确保Bullet并没有混淆吗?

这样可以帮助你确定问题所在。


很有趣,我会去查看一下。我没有想到子弹可能是问题所在。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接