2013-05-26 36 views
1

我有書籍模型,用戶模型和閱讀模型。一本書可以有多個閱讀,而一個用戶可以有多個閱讀。基本上,在閱讀是所有用戶已閱讀的書籍。顯示未讀書籍列表

現在我想顯示某個用戶的所有未讀書籍的列表。假設用戶登錄並且有一個current_user對象,我將如何獲得這樣的列表?

我有這個目前:

@unread_books = Book.find(:all, include: :reads, conditions: ["books.id NOT IN (?)", current_user.read_ids]) 

但是這本書映射ID的讀取的ID。它應該是這樣的:

conditions: ["books.id NOT IN (?)", current_user.read_book_ids] 

但是,這給出了一個錯誤:

undefined method `read_book_ids' for #<User:0x007fb21782b3f8> 

所以,我怎麼能書的ID映射到外鍵書ID在讀?

回答

1

使用LEFT OUTER JOIN來獲得這些書;對當前用戶標識具有或沒有讀取的書籍。然後選擇那些沒有附加用戶的書籍,這些書籍包含在外部聯合中(但不包含在內部聯結中)。這些正是那些未被讀取當前用戶的書:

SELECT books.id, books.title FROM books 
LEFT OUTER JOIN readings 
    ON readings.book_id = books.id 
    AND readings.user_id = 1 
WHERE readings.user_id IS NULL 

Tests on SQLFiddle.

在Rails,這可能是這樣的(未測試):

Books.joins("LEFT OUTER JOIN reads\ 
    ON reads.book_id = books.id\ 
    AND reads.user_id = :user_id", user_id: current_user.id) 
.where("reads.user_id IS NULL") 

的你的方法存在的問題是,你可能會傳遞大量的id來忽略。必須搜索每個條目的ID,這非常低效。