包含的 Activerecord Force Index

Activerecord Force Index with includes

我正在尝试构建一个强制索引的 ActiveRecord 语句,同时还使用 include。

声明类似于:

Job.from("jobs FORCE INDEX(index1,index2)").includes(:workflow)

然而 AR 似乎不喜欢这样并抛出:

NoMethodError (undefined method `map' for "jobs FORCE INDEX(index1,index2)":Arel::Nodes::SqlLiteral):

有人知道吗?如果取消包含语句,一切正常,所以我假设它正在尝试构建 LEFT OUTER JOIN 和 table 别名查询...

谢谢 M

根据对问题的评论,事实证明 count 对具有 fromincludes 的链的调用(包含关联的条件)是问题。

事实上,似乎只使用 from 调用,即使它只是 from("jobs") 也会导致问题,因此力指数有点转移注意力。

在这种情况下(需要计数),我找不到使用 includes 的解决方案。但是,如果您包含关联并为其添加条件,那么无论如何 joins 应该等同于 includes(我认为!)。在这种情况下,以下应该有效(我将其分解为多个步骤以使其更明显):

 q = Job.from("jobs FORCE INDEX(index1,index2)")
 q = q.joins(:workflow)
 q = q.where("workflows.name = 'Bob'")
 q.count

如果您确实需要 includes 提供的左外层,那么您可以手动指定:

 q = Job.from("jobs FORCE INDEX(index1,index2)")
 q = q.joins("left outer join workflows on workflows.job_id = jobs.id")
 q = q.where("workflows.name = 'Bob'")
 q.count