【问题标题】:Activerecord Force Index with includesActiverecord 强制索引,包括
【发布时间】:2015-04-23 13:16:03
【问题描述】:

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

语句看起来像:

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 和表别名查询...

谢谢 M

【问题讨论】:

  • 似乎在 rails 4 中工作正常。可能值得探索从 rails 3 和 rails 4 之间的差异(api.rubyonrails.org/v3.2.11/classes/ActiveRecord/… 和 api.rubyonrails.org/classes/ActiveRecord/…)
  • 嗨沙德威尔。它工作正常,除非 activerecord 必须基于其中一个包含执行查询。所以更完整的例子是 Job.from("jobs FORCE INDEX(index1,index2)").includes(:workflow).where("workflows.name = 'Bob'")...
  • 您需要添加一个references 呼叫:where("workflows.name = 'Bob'").references('workflows')
  • 嗨 Shadwell - 谢谢,我想可能是这样,但我们使用的是 Rails 3.2.19; Rails 3有什么可以支持它的吗?谢谢
  • 不,完全被难住了。我现在已经在 rails 3 上尝试过了,它对我来说也很好用。您需要发布完整的堆栈跟踪。是否有可能您正在使用已扩展的 Job 类或不是 ActiveRecord 类?

标签: ruby-on-rails ruby-on-rails-3 activerecord arel


【解决方案1】:

根据问题中的 cmets,事实证明,在具有 from 和 includes 的链上调用 count(包含关联的条件)是问题所在。

事实上,似乎只使用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

【讨论】:

  • 注意:rails 4 或 rails 3 也是一个红鲱鱼。这应该可以解决 rails 4 和 rails 3 上的问题。
  • 真棒沙德威尔。不知道连接的语法(或者更确切地说,我从来没有想过我可以这样做)!
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多