ruby-on-rails – 当你还使用after_initialize回调时,如何解决Ac
模型:
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相同的事情…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |