我有一个简单的数据库,其中包含以下架构:
Book
有许多Tags
到Taggings
Book
有许多Users
到ReadingStatuses
我想要做的是列出每本书的所有书籍,标签和当前登录用户的阅读状态。我已设法使用Arel(使用arel-helpers
gem)编写此内容,但我不知道如何在book
迭代时访问每个books
条目中的结果数组。
这是查询
join_params = Book.arel_table.join(ReadingStatus.arel_table, Arel::OuterJoin)
.on(Book[:id].eq(ReadingStatus[:book_id])
.and(ReadingStatus[:user_id].eq(User.first.id)))
.join_sources
books = Book.all.includes(:tags).joins(join_params)
以及它生成的相应SQL
SELECT "books".* FROM "books"
LEFT OUTER JOIN "reading_statuses"
ON "books"."id" = "reading_statuses"."book_id"
AND "reading_statuses"."user_id" = 'XXX'
tags
没有什么可以做的,因为includes
会在调用book.tags
时自动使一切正常,但我不知道的是在迭代ReadingStatus
结果时如何访问加入每个Book
的{{1}}
答案 0 :(得分:-1)
尝试使用includes代替联接。 “includes”确实很吸引人,但是如果你不介意它可能会让你查询看起来更简单。
您也不必明确提及左外连接。
看看是否有帮助:
Pulling multiple levels of data efficiently in Rails
Rails: How to fetch records that are 2 'has_many' levels deep?
确保包含对references
的调用“ReadingStatus [:user_id] .eq(User.first.id)”可以转移到where子句