2011-01-28 72 views
1

我有以下模型:用戶,組,對話,對話參與者(有一個讀取布爾值)Rails - 構建查詢 - 命名範圍或?

我想要做的是獲得一個特定用戶在一個特定的組的未讀數。

我應該爲此使用named_scope嗎?如果是這樣,這屬於哪個模型(不知道)...

另外,我可以這樣做:@ user.conversation_participations然後有讀字段,問題是它沒有組字段作爲conversation_participations鏈接到會話(具有group_id)通過conversation_id鍵。

想法?

謝謝

+0

任何一個?這個問題是否令人困惑? – AnApprentice 2011-01-28 21:24:23

回答

0

如果我理解正確的問題。我會用在所謂的像in_group的ConversationParticipants一個named_scope:

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) 
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 

您要求「未讀對話屬於特定用戶和組」。由於被要求的東西是一組對話,所以這是放置範圍的自然地方。

編輯

我看到你想要的數量,而不是結果集。只需添加.count的範圍:

Conversation.unread(user,group).count 

EDIT 2

是有可能做這樣的事情 這反而得到#, current_user.unread(集團).Count中.. ?

上的用戶添加一個實例方法:

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

現在,您可以撥打current_user.unread(group).count

+0

非常感謝。但有可能做這樣的事情,而不是獲得#,current_user.unread(group).count ..?我認爲這將是更清潔,這是我沒有任何運氣後所經歷的。思考? – AnApprentice 2011-01-28 23:25:08