2015-04-23 2 views
4

Я пытаюсь построить оператор ActiveRecord, который заставляет индекс, в то время как также включает в себя.Индекс силы действия Activerec включает в себя

заявление выглядит что-то вроде:

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

+1

Кажется, что все в порядке в рельсах 4. Возможно стоит изучить различия между рейлами 3 и рельсами 4 (http://api.rubyonrails.org/v3.2.11/classes/ActiveRecord/QueryMethods.html#method- i-from и http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from) – Shadwell

+0

Привет, Shadwell. он отлично работает, за исключением случаев, когда activerecord должен выполнить запрос на основе одного из включений. Таким образом, более полным примером будет Job.from («jobs FORCE INDEX (index1, index2)»). Включает (: workflow) .where ("workflows.name = 'Bob'") ... – user3707

+0

Вам нужно будет добавить вызов 'reference':' where ("workflows.name = 'Bob'"). reference ('workflows') ' – Shadwell

ответ

1

В соответствии с замечаниями по этому вопросу, то получается, что count вызывать цепочку, которая имеет from и includes (с условием включенной ассоциации) является проблемой.

На самом деле кажется, что использование только звонка 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 
+0

Примечание: рельсы 4 или рельсы 3 были также красной селедкой. Это должно решить проблему как на рельсах 4, так и на рельсах 3. – Shadwell

+0

Awesome Shadwell. Не знал об этом синтаксисе для присоединений (или, вернее, мне никогда не приходило в голову, что я мог бы это сделать)! – user3707