2011-01-28 8 views
1

私は次のモデルを持っています:ユーザー、グループ、会話、会話の参加者(読み込みブール値を持っています)Rails - クエリの名前付きスコープの作成?

私がしたいのは、特定のグループの特定のユーザーの未読数です。

これにnamed_scopeを使用する必要がありますか?もしそうなら、どのモデルがこれに属するのでしょうか(わかりません)...

また、私はできます:@ user.conversation_participationsこれは読み込みフィールドを持っています。問題は、conversation_participationsとしてのグループフィールドはありませんconversation_idキーを使用して会話(group_idを持つ)を行います。

思考?

ありがとうございます。

+0

を呼び出すことができますか?紛らわしいのですか? – AnApprentice

答えて

0

私は質問を正しく理解しています。

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

私はConversationParticipantsがbelongs_to :conversationを持っていると仮定している:私はin_groupのようなものと呼ばれるConversationParticipantsでnamed_scopeを使用します。

は今、あなたが行うことができます:

@user.conversation_participations.in_group(some_group) 
1

をあなたはモデルのコードを示さなかったので、私はいくつかの仮定をしました。 1つの方法があります:

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を追加:2

Conversation.unread(user,group).count 

EDITは#、 current_user.unread(グループ).countを取得する代わりに このような何かをすることが可能です。.. ?

ユーザーのインスタンスメソッド追加:

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

を今、あなたは、任意の1 current_user.unread(group).count

+0

非常にクールな感謝。 #、current_user.unread(group).count ..を取得する代わりに、このようなことをすることは可能ですか?私はそれがどんな運があれば私がしてきたものであることがよりきれいになるだろうと思う。思考? – AnApprentice

関連する問題