通过连接表计算关联的性能

时间:2016-01-13 08:45:58

标签: ruby-on-rails activerecord

我有模特人和组织。 它们通过联接表organizational_persons

链接在一起

Organization.rb

has_and_belongs_to_many :persons, -> { where(:persons => { is_deleted: false }) }, join_table: :organizations_persons

在获取整个组织树(使用ActsAsTree gem)时,我还会在每个组织的视图中包含人数。

我在联名表中拥有约200个组织,1500人和2500个记录。

在不包含membercount的情况下构建整个树需要大约900ms。 当我包含membercount时,需要~300ms使用organization.persons.size,~500ms使用organizations.persons.distinct.size和使用原始sql,当使用rails生成的相同sql,organization.persons.size,~1100ms。

organizational.persons.size生成了这个sql:

SELECT COUNT(*) FROM `persons` INNER JOIN `organizations_persons` ON `persons`.`id` = `organizations_persons`.`person_id` WHERE `persons`.`is_deleted` = 0 AND `organizations_persons`.`organization_id` = 81

organizations.persons.distinct.size生成此sql:

SELECT `persons`.* FROM `persons` INNER JOIN `organizations_persons` ON `persons`.`id` = `organizations_persons`.`person_id` WHERE `persons`.`is_deleted` = 0 AND `organizations_persons`.`organization_id` = 81

无论如何我可以在不使用原始sql的情况下加速关联计数吗? 我使用的是rails 4.2

0 个答案:

没有答案