使用自定义Arel连接时如何访问连接列?

时间:2015-03-19 22:40:50

标签: sql ruby-on-rails ruby arel

我有一个简单的数据库,其中包含以下架构:

  • Book有许多TagsTaggings
  • Book有许多UsersReadingStatuses

我想要做的是列出每本书的所有书籍,标签和当前登录用户的阅读状态。我已设法使用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}}

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?

Eager loading

确保包含对references

的调用

“ReadingStatus [:user_id] .eq(User.first.id)”可以转移到where子句

相关问题