【问题标题】:How do I access the joined columns when using custom Arel joins?使用自定义 Arel 联接时如何访问联接列?
【发布时间】:2015-03-19 22:40:49
【问题描述】:

我有一个具有以下架构的简单数据库:

  • Book 有很多 TagsTaggings
  • Book 有很多 UsersReadingStatuses

我要做的是列出所有书籍、它们的标签以及当前登录用户对每本书的阅读状态。我已经设法使用 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


【解决方案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子句中

【讨论】:

  • includes 在这种情况下不起作用,因为我需要自定义事物的连接方式,而不仅仅是加载关联的记录。
  • 自定义连接是什么意思?包括您要加入的相同关系上的联接。 IE。外键 book_id。 “ReadingStatus[:user_id].eq(User.first.id)”可以转移到where子句中吗?您是否在调用引用时使用包含?
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 2012-08-19
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多