Sql 显示未读书籍列表
我有一个图书模型,一个用户模型和一个阅读模型。一本书可以有很多次阅读,一个用户可以有很多次阅读。基本上,in Read是某个用户读过的所有书籍 现在我想显示某个用户所有未读书籍的列表。假设用户已登录并且存在当前的用户对象,我如何获得这样的列表 我目前有:Sql 显示未读书籍列表,sql,ruby-on-rails-3,Sql,Ruby On Rails 3,我有一个图书模型,一个用户模型和一个阅读模型。一本书可以有很多次阅读,一个用户可以有很多次阅读。基本上,in Read是某个用户读过的所有书籍 现在我想显示某个用户所有未读书籍的列表。假设用户已登录并且存在当前的用户对象,我如何获得这样的列表 我目前有: @unread_books = Book.find(:all, include: :reads, conditions: ["books.id NOT IN (?)", current_user.read_ids]) 但是这张地图把书的id映
@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>
未定义的方法“read\u book\u id”#
那么,如何将图书id映射到Read中的外键图书id?使用a获取这些图书;对于当前用户id具有或没有读取的书籍。然后仅选择那些没有附加用户的书籍,这些书籍包含在外部联接(但不包含在内部联接)中。这些正是当前用户尚未阅读的书籍:
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
在Rails中,可能是这样(未经测试):
您的方法的问题在于,您可能传递了一个非常大的ID数组以供忽略。必须搜索每个条目的id,这是非常低效的;对于当前用户id具有或没有读取的书籍。然后仅选择那些没有附加用户的书籍,这些书籍包含在外部联接(但不包含在内部联接)中。这些正是当前用户尚未阅读的书籍:
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
在Rails中,可能是这样(未经测试):
您的方法的问题在于,您可能传递了一个非常大的ID数组以供忽略。必须搜索每个条目的id,这是非常低效的