Rails - подсчитать запрос при объединении трех таблиц в одну - PullRequest
0 голосов
/ 27 мая 2011

У меня довольно простой запрос, который, похоже, не может быть правильным ....

Моя модель:

  • Пользователь - имеет много Дружеских отношений (с другими пользователями)
  • Пользователь - имеет много представлений
  • Пользователь - имеет много комментариев
  • Пользователь - имеет много голосов

Мне нужен счет, который представляет

Все друзья пользователя current_user, чьи представления, комментарии или голоса были созданы на дату> current_user.last_refresh_date

Сейчас я создаю массив, перебирая дружеские отношения и добавляя все предложения, комментарии и голоса. Затем я повторяю этот встроенный массив, сравнивая даты, чтобы определить, следует ли увеличить счет. Не самое идеальное решение.

Редактировать :

@ TobiasCohen

Эффективное решение. Спасибо!

Followup:

Я хочу добавить еще один отсчет к настоящему запросу. Мне нужно подсчитать все новые комментарии и голоса на current_user.submissions, которые не являются частью первоначального подсчета (т.е. не друга).

Псевдо-код:

current_user.submissions.join (: комментарии,: голоса,: друзья) .where ('last_activity>? AND friend_id! =?', Current_user.last_refresh_date, current_user.id) .count

Я не могу получить правильный запрос (новичок в сложных запросах через активную запись).

Я собирался сделать это отдельным запросом, а затем добавить его к исходному количеству. Может ли оно быть включено в один запрос вместо двух?

1 Ответ

2 голосов
/ 27 мая 2011

Я думаю, что вы получите наилучшие результаты, добавив столбец кеша для Пользователя, назовем его :last_activity_at, а затем обновим его обратным вызовом after_create при отправке, комментировании и голосовании.

class Submission < ActiveRecord::Base
  belongs_to :user

  after_create :update_user_last_activity_at

  private
    def update_user_last_activity_at
      user.update_attribute :last_activity_at, Time.now
    end
end

Затем вы можете получить пользователей просто с помощью:

current_user.friends.where('last_activity_at > ?', current_user.last_refresh_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...