2010-11-02 69 views
0

我正在構建一個模型,用於跟蹤給定用戶已閱讀的帖子(在Rails 3中)。跟蹤這個表的是「讀數」。閱讀belongs_to:用戶和:帖子,兩者都has_many:讀數。當用戶看到帖子時,它會被標記爲已讀,並且會使用user_id和post_id創建'閱讀'。這似乎工作正常,但現在我試圖編寫一個範圍,只返回給定用戶的未讀帖子。查找閱讀帖子工作正常:獲取軌範範圍的補足/過濾出匹配項的範圍

scope :read, lambda { |user_id = nil |  
    user_id.nil? ? {} : joins(:readings).where('readings.user_id = :user_id', :user_id => user_id) 
} 

但是,我試圖返回這套(未讀帖子)的補充是失敗的。如何才能做到這一點?有沒有一種通用的方法來編寫一個範圍(方法),它只是返回另一個(這裏是:read)的補碼?我也很樂意把它寫成一個和範圍一樣的類方法。

請記住,閱讀僅在閱讀帖子時創建,因此新帖子將不會有任何閱讀。這似乎比爲每個新帖子爲每個用戶創建條目更經濟。

編輯:好的,我越來越接近 - 下面的範圍幾乎可以工作,但並不要求所有閱讀的帖子都不等於user_id。因此,如果用戶#1讀取了帖子,並且用戶#2讀取了帖子,則查詢其他讀數並發現不相等。所以這篇文章被錯誤地發現是未讀的。

scope :unread, lambda { |user_id = nil |  
    user_id.nil? ? {} : includes(:readings).where('(readings.user_id IS NULL OR readings.user_id != :user_id)', :user_id => user_id) 
} 

回答

0

那麼,它看起來像下面的作品。仍在測試。如果有人在這裏發現一個洞,很樂意重新開放。

scope :unread_by, lambda { |user_id = nil, hide_unread = nil| 
     { :joins => "LEFT JOIN readings ON readings.post_id = post.id 
      AND readings.user_id  = #{user_id}", 
      :conditions => 'readings.id IS NULL' } 
}