2015-04-23 84 views
4

我想構建一個強制索引,同時也使用包括一個ActiveRecord語句。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和表別名查詢...

感謝 中號

+1

似乎可以在rails 4中正常工作。值得探索從rails 3和rails 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

Hi Shadwell。它工作正常,除非activerecord必須執行基於其中一個包含的查詢。所以一個更完整的例子是Job.from(「jobs FORCE INDEX(index1,index2)」)。includes(:workflow).where(「workflows.name ='Bob'」)... – user3707

+0

您需要添加一個'references'調用:'where(「workflows.name ='Bob'」)。references('workflows')' – Shadwell

回答

1

按照有關問題的意見事實證明,該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 
+0

注意:rails 4或rails 3也是一種紅鯡魚。這應該可以解決導軌4和導軌3上的問題。 – Shadwell

+0

Awesome Shadwell。不知道連接的語法(或者說,我從來沒有想過我可以這樣做)! – user3707