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

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.

(编辑:李大同)

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

    推荐文章
      热点阅读