admin管理员组文章数量:1289893
I include an association with additional attribute projects_count
. Even with the includes
method, I still got N+1 queries for categories. I guess it's because of the dynamic argument in categories_with_projects_count
but I don't know how to achieve it without dynamic argument
class User < ApplicationRecord
has_many :categories_with_projects_count, ->(user) { with_projects_count(user.id) }, through: :user_profile, source: :categories
end
class UserProfile < ApplicationRecord
has_and_belongs_to_many :categories
end
class Category < ApplicationRecord
scope :with_projects_count, lambda { |user_id|
select('categories.*, COALESCE(won_projects_stats.count, 0) AS projects_count')
.joins(<<~SQL.squish)
LEFT JOIN (
SELECT cat.parent_id AS parent_category_id, cat.id AS category_id, COUNT(*) AS count
FROM projects
INNER JOIN categories_projects ON (categories_projects.project_id = projects.id)
INNER JOIN categories cat ON (categories_projects.category_id = cat.id)
INNER JOIN offers ON (projects.id = offers.project_id)
WHERE offers.state = 'accepted' AND offers.user_id = #{user_id}
GROUP BY 1, 2
) AS won_projects_stats ON (
categories.id = won_projects_stats.parent_category_id
OR categories.id = won_projects_stats.category_id
)
SQL
}
end
@users = User.includes(categories_with_projects_count: [:users_seo_tagging_page, :parent, { logo_attachment: :blob }])
@user.each do |u|
u.categories_with_projects_count.each do |c|
...
end
end
本文标签: ruby on railsPrevent N1 queries with custom select in associationStack Overflow
版权声明:本文标题:ruby on rails - Prevent N+1 queries with custom select in association - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741427630a2378167.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论