【发布时间】:2015-03-19 22:40:49
【问题描述】:
我有一个具有以下架构的简单数据库:
-
Book有很多Tags到Taggings -
Book有很多Users到ReadingStatuses
我要做的是列出所有书籍、它们的标签以及当前登录用户对每本书的阅读状态。我已经设法使用 Arel(使用 arel-helpers gem)编写了这个,但我不知道如何在遍历 books 数组时访问每个 book 条目中的结果。
这是查询
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迭代books 结果时加入每个Book?
【问题讨论】:
-
通过添加您自己的选择,如 Book.select("books.*, reading_statuses.*").includes(:tags).joins(join_params)
-
@ilanberci 那么我该如何访问它呢?
book.reading_status即使使用 select 也不起作用 -
这些字段被合并到最终的结果集中。 (尽管您认为您在结果集中获得了 Book 类,但实际上并没有。)只需调用 books.user_id,您就会看到
标签: sql ruby-on-rails ruby arel