我有4个模型:Person
,School
,Home
,Office
。
它们都具有id
和name
我的主要模特是 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
我该如何处理?
答案 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标记,因此具有单个计数器缓存和仅