Sql 使用自定义Arel联接时,如何访问联接的列?

Sql 使用自定义Arel联接时,如何访问联接的列?,sql,ruby-on-rails,ruby,arel,Sql,Ruby On Rails,Ruby,Arel,我有一个具有以下模式的简单数据库: 这本书有许多标签 这本书通过阅读状态有很多用户 我想做的是列出所有的书,它们的标签,以及每本书当前登录用户的阅读状态。我已经用Arel和Arel helpers gem写了这篇文章,但是我不知道在遍历books数组时如何访问每个图书条目中的结果 这是问题 join_params = Book.arel_table.join(ReadingStatus.arel_table, Arel::OuterJoin)

我有一个具有以下模式的简单数据库:

这本书有许多标签 这本书通过阅读状态有很多用户 我想做的是列出所有的书,它们的标签,以及每本书当前登录用户的阅读状态。我已经用Arel和Arel helpers gem写了这篇文章,但是我不知道在遍历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'
标记实际上没有什么可做的,因为调用book.tags时includes会自动使一切工作正常,但我不知道的是,在迭代books结果时,如何访问连接到每本书的ReadingStatus?

尝试使用代替连接。includes不执行即时抓取,但如果您不介意的话,它可能会使您的查询看起来更简单

您也不必明确提到左外连接

看看这是否有帮助:

确保您将呼叫包括在内


ReadingStatus[:user_id].eqser.first.id可以通过在Book.selectbooks.*、reading_status.*中添加您自己的select as来转换为where子句

。包括:tags.joinsjoin_params@ilanberci那么,我如何访问它?book.reading\u状态即使在选择时也不起作用。字段将合并到最终结果集中。虽然你认为你的成绩集中有一门图书课,但你没有。只要调用books.user_id,您就会看到includes在这种情况下不起作用,因为我需要自定义连接方式,而不仅仅是加载关联的记录。自定义连接是什么意思?包括与您要加入的关系相同的连接。也就是说,外键book\u id.ReadingStatus[:user\u id].eqser.first.id可以转移到where子句中,对吗?您是否在调用引用时使用include?