Rails - Создание запроса - именованный объем или? - PullRequest
1 голос
/ 28 января 2011

У меня есть следующие модели: пользователи, группы, беседы, участники беседы (имеет логическое значение для чтения)

Я хочу получить непрочитанный счетчик для конкретного пользователя в определенной группе.

Должен ли я использовать named_scope для этого?Если да, то к какой модели это относится (не уверен) ...

Кроме того, я могу сделать: @ user.conversation_participations, который затем имеет поле чтения, проблема в том, что у него нет поля группы какословия_частейссылки на разговоры (которые имеют идентификатор_группы) с помощью ключа сеанса разговора.

Мысли?

Спасибо

Ответы [ 2 ]

1 голос
/ 29 января 2011

Вы не показали код для моделей, поэтому я сделал несколько предположений. Вот один из способов:

class Conversation < ActiveRecord::Base
  belongs_to :group
  has_many :conversation_participants
  has_many :participants, :through => :conversation_participants,\
    :source => :user

  scope :unread, lambda { |user,group| includes(:group,:conversation_participants).\
    where(:group_id => group.id,\
          :conversation_participants => {:read => false,:user_id => user.id})
  }
end

Вы запрашиваете "непрочитанные разговоры, принадлежащие определенному пользователю и группе". Поскольку запрашиваемая вещь - это набор бесед, это естественное место для определения области действия.

EDIT

Я вижу, вы хотели счетчик, а не набор результатов. Просто добавьте .count в область действия:

Conversation.unread(user,group).count

РЕДАКТИРОВАТЬ 2

можно ли сделать что-то вроде вместо этого, чтобы получить #, current_user.unread (group) .count ..?

Добавить метод экземпляра для пользователя:

  def unread(group)
    Conversation.unread(self,group)
  end

Теперь вы можете звонить current_user.unread(group).count

0 голосов
/ 29 января 2011

Если я правильно понял вопрос.Я бы использовал named_scope в ConversationParticipants, который называется что-то вроде in_group:

scope :in_group, lambda do
  |group| joins(:conversation).where('conversation.group_id = ?', group.id)
end

Я предполагаю, что ConversationParticipants имеет belongs_to :conversation.

Теперь вы можете сделать:

@user.conversation_participations.in_group( some_group )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...