gpt4 book ai didi

ruby-on-rails - 当还使用 after_initialize 回调时,如何解决 ActiveRecord (Rails 3) 中的 n+1 查询问题?

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:18 26 4
gpt4 key购买 nike

型号:

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
end
end

查找项目的语句:

@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 查询问题。但是,我宁愿不这样做,所以我更喜欢对一般问题的回答,而不是我的具体示例。

最佳答案

看一下rails eager loading http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

您可以在使用includes加载对象时加载关联

User.find(2).includes(:assets)#will load all assets with user

或者您可以在模型中指定预加载关联

应用程序/模型/user.rb

class User< AR::Base
has_many :posts,:include=>:comments
end

class Post < AR::Base
has_many :comments
belongs_to :user
end

现在 u.posts 将为每个帖子加载评论

关于ruby-on-rails - 当还使用 after_initialize 回调时,如何解决 ActiveRecord (Rails 3) 中的 n+1 查询问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com