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