
class Project < ActiveRecord::Base has_many :user_roles after_initialize :add_user_roles def add_user_roles UserRoles.all.each do |ur| self.user_roles << ur unless self.user_roles.include?(ur) end endend
查找项目的声明:
@projects = Project.includes(:user_roles)
所以你可以看到,我告诉它在查询中包含用户角色关联.但是,我仍然看到n 1查询问题:它为每个项目找到一次角色.
如果我从回调中删除self.user_roles的用法并查看日志,我可以看到它在2个查询中找到项目及其用户角色 – 一个用于项目,一个用于使用project_ID in(1,2),3,4,5 ……,N).
有办法解决这个问题吗?
让我澄清一点:虽然我愿意在需要时解决我的具体情况,但我更喜欢那些专注于如何解决问题的答案.我能够写一个kludge来使数据处于我想要的状态而不使用after_initialize回调,因此不会进入n 1查询问题.但是,我宁愿不这样做,所以我更喜欢一般问题的答案而不是我的具体例子.
解决方法 即使是热切加载的关联也不能在after_initialize中使用(它们在初始化记录后加载).有关讨论,请参阅此Rails问题:https://github.com/rails/rails/issues/13156
与原始问题相关:看起来每个项目都有相同的UserRole对象集.我猜测有一个has_many:通过它已被消毒了,但即便如此,一个项目如何最终没有完整的设置?我没有看到Project和UserRole在这里实际连接的方式 – 从示例中可见的内容看出:
class Project < ActiveRecord::Base def user_roles UserRole.all endend
会完成与after_initialize相同的事情……
总结以上是内存溢出为你收集整理的ruby-on-rails – 当你还使用after_initialize回调时,如何解决ActiveRecord(Rails 3)中的n 1查询问题?全部内容,希望文章能够帮你解决ruby-on-rails – 当你还使用after_initialize回调时,如何解决ActiveRecord(Rails 3)中的n 1查询问题?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)