2016-01-13 57 views
0

我有4個機型:Person,School,Home,Office獲取具有多個關聯內容的對象

他們都具有的屬性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 

我該如何解決這個問題?

+0

我清理了您的文章...請花時間審查電子郵件點,你的帖子之前是一個完整的混亂 –

回答

1

有很多種方法:

  • 您可以使用用於計數counter_cache樣列(但你必須回調添加到所有相關的模型來更新它在創建/刪除原爲counter_cache一樣)

  • 只需使用獨立的計數器緩存爲每個關係(如鋼軌的4級計數器緩存應該在HABTM關係工作),並通過這些

  • 重型SQL子查詢和選擇(通常不recomended,除非是一次性的任務,或者你有一點數據,因此沒有性能問題)

查詢,如:

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因此有單個計數器緩存和能力只是
相關問題