我有模特人和组织。 它们通过联接表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