获取具有多个关联内容的对象

时间:2016-01-13 14:57:12

标签: ruby-on-rails

我有4个模型:PersonSchoolHomeOffice

它们都具有idname

属性

我的主要模特是 person.rb

class Person < ActiveRecord::Base
  has_and_belongs_to_many :school, join_table: :school_persons
  has_and_belongs_to_many :home, join_table: :home_persons
  has_and_belongs_to_many :office, join_table: :office_persons
end

我想找到所有至少有10个相关内容的人。

我尝试将其加入一个模型,但我希望内容中至少包含10个来自所有模型的相关内容。

person.find_by_sql("
  SELECT person.* 
    FROM persons 
    INNER JOIN office_persons ON persons.id = office_persons.person_id     
    GROUP BY persons.id
    HAVING COUNT(office_persons.art_id) = 10
").count

我该如何处理?

1 个答案:

答案 0 :(得分:1)

有几种方式:

  • 您可以使用类似counter_cache的列进行计数(但是您必须向所有相关模型添加回调以在创建/删除时将其更新为原始的counter_cache)

  • 对每个关系使用单独的计数器缓存(从rails 4计数器缓存应该适用于HABTM关系)并按这些关系的总和进行选择

  • 重型sql子查询(通常不推荐,除非是一次性任务或者数据很少,因此没有性能问题)

查询如下:

 SELECT persons.* FROM persons
 WHERE ((select count(*) from office_persons where person_id=persons.id) + 
        (select count(*) from home_persons where person_id=persons.id)+
        (select count(*) from school_persons where person_id=persons.id)) >= 10
  • 使用单个连接表重构为has_many through:...并为home / office / etc标记,因此具有单个计数器缓存和仅
  • 的能力