2015-04-26 2 views
0

Допустим, у меня есть модель User, и каждый пользователь имеет ассоциацию под названием user_logins, которая создается при каждом входе в систему, сохраняя информацию о своем логине.Лучший способ найти пользователей с определенными ассоциациями

Что мне нужно сделать, это найти всех пользователей, у которых есть 5 записей user_login, где сегодня была создана пятая запись.

Что-то вроде этого:

users = User.all.where(user_logins_count == 5, user_login.last.created_at == today) 

user_logins_count является кэш счетчик я настроил.

Конечно, этот код является жестоким, но, надеюсь, он подробно остановится на том, чего я пытаюсь достичь.

PG ОШИБКА

rake aborted! 
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "last 
" 
LINE 1: ...n_logins_count" = 5 GROUP BY humans.id HAVING MAX(human_logi... 
                  ^

Новый код:

humans = user.humans.joins(:human_logins).where(human_logins_count: 5) 
     .group('humans.id') 
     .having('MAX(human_logins.created_at) >= ?', Date.today) 

ответ

3

Вы можете определить это как сферу внутри User класса:

class User 
    scope :logged_in_a_lot_today, -> do 
    joins(:user_logins).where(user_logins_count: 5) 
     .group('users.id') 
     .having('MAX(user_logins.created_at) >= ?', Date.today) 
    end 
end 

Теперь вы можете просто получить эти пользователь :

User.logged_in_a_lot_today 

Поскольку она определяется как объем, вы также можете добавить дополнительные условия, если вы хотите:

User.logged_in_a_lot_today.where(name: 'John Doe') 

Обратите внимание, что это, вероятно, будет хорошей идеей создать частичный индекс (если ваша база данных поддерживает его) для пользователей, у которых есть user_logins_count из 5.

+0

Спасибо fivedigit, будут ли объединения и группы работать в postgres? как я знаю, это может быть несколько отрывочно с ними звонки –

+0

Я действительно тестировал это в postgres, поэтому он должен работать как шарм! ;) – fivedigit

+0

Удивительный, спасибо! –

Смежные вопросы