2016-01-13 2 views
0

У меня есть 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

Я очистил ваше сообщение ... пожалуйста, найдите время, чтобы просмотреть e dit, ваш пост был полным беспорядком перед –

ответ

1

Там уже несколько способов:

  • Вы можете использовать counter_cache -как колонку для подсчета (но вы должны добавить обратные вызовы для всех связанных моделей, чтобы обновить его на создание/удаление, как оригинал counter_cache делает)

  • Просто используйте отдельный счетчик кэша для каждого соотношения (по рельсам 4 счетчика кэша должны работать на HABTM отношениях) и выберите на сумме этих

  • Heavy 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 
  • Refactor к has_many through:... с одним присоединиться стол и флаг home/office/etc таким образом имеют одинарный счетчик кэш и возможность только
Смежные вопросы