我是面对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个查询。
答案 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