加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 当你还使用after_initialize回调时,如何解决Ac

发布时间:2020-12-17 02:52:37 所属栏目:百科 来源:网络整理
导读:模型: 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 = Proj
模型:

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

解决方法

即使是热切加载的关联也不能在after_initialize中使用(它们在初始化记录后加载).有关讨论,请参阅此Rails问题:

https://github.com/rails/rails/issues/13156

与原始问题相关:看起来每个项目都有相同的UserRole对象集.我猜测有一个has_many:通过它已被消毒了,但即便如此,一个项目如何最终没有完整的设置?我没有看到Project和UserRole在这里实际连接的方式 – 从示例中可见的内容看出:

class Project < ActiveRecord::Base
  def user_roles
    UserRole.all
  end
end

会完成与after_initialize相同的事情……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读