使用with_role进行rolify(n + 1)问题

时间:2016-10-31 14:03:40

标签: ruby-on-rails

我是面对n + 1问题的新手。

控制器:

def index
    @merchants = Merchant.includes(users: [:users_roles])
    .page(params[:page]).per(10)
end

查看:

<% @merchants.each do |m| %>
<% admins = m.users.with_role('merchant') %>

列出时会提取10个查询。

1 个答案:

答案 0 :(得分:0)

这里的问题是你已经包含了用户角色,如果你开火,将会避免n + 1 queries

@merchant.first.users
# or
@merchant.first.users.first.user_roles

admins = m.users.with_role('merchant')

上面的代码添加了一个where条件,它不会使用包含的关联。

<强>解决方案

在商家中创建一个新的关联,其条件类似于

has_many :merchant_users, -> { joins(:user_roles).where(user_roles: { name: 'merchant' }) }, class_name: 'User'

并加入

@merchants = Merchant.includes(merchant_users: [:users_roles])

请参阅此帖子,了解如何include-scoped-associations