ruby-on-rails – activerecord has_many:通过一次sql调用查找
发布时间:2020-12-17 03:51:03 所属栏目:百科 来源:网络整理
导读:我有这3个型号: class User ActiveRecord::Base has_many :permissions,:dependent = :destroy has_many :roles,:through = :permissionsendclass Permission ActiveRecord::Base belongs_to :role belongs_to :userendclass Role ActiveRecord::Base has_m
我有这3个型号:
class User < ActiveRecord::Base has_many :permissions,:dependent => :destroy has_many :roles,:through => :permissions end class Permission < ActiveRecord::Base belongs_to :role belongs_to :user end class Role < ActiveRecord::Base has_many :permissions,:dependent => :destroy has_many :users,:through => :permissions end 我想在一个sql语句中找到一个用户和它的角色,但我似乎无法实现这一点: 以下声明: user = User.find_by_id(x,:include => :roles) 给我以下问题: User Load (1.2ms) SELECT * FROM `users` WHERE (`users`.`id` = 1) LIMIT 1 Permission Load (0.8ms) SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.user_id = 1) Role Load (0.8ms) SELECT * FROM `roles` WHERE (`roles`.`id` IN (2,1)) 不完全理想.我如何做到这一点,以便它使用连接执行一个SQL查询并将用户的角色加载到内存中,这样说: user.roles 不会发出新的SQL查询 解决方法
在单独的SQL查询中加载角色实际上是一种称为“优化的预先加载”的优化.
Role Load (0.8ms) SELECT * FROM `roles` WHERE (`roles`.`id` IN (2,1)) (这样做而不是单独加载每个角色,N 1问题.) Rails团队发现使用IN查询通常更快,之前查找的关联代替进行大连接. 只有在其他表之一上添加条件时,才会在此查询中进行连接. Rails会检测到这一点并进行连接. 例如: User.all(:include => :roles,:conditions => "roles.name = 'Admin'") 请参阅original ticket,本previous Stack Overflow question和Fabio Akita的博文,内容约为Optimized Eager Loading. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |