2014-10-31 44 views
2

我想在我的rails應用上實現neo4j-will_paginate gem的分頁,但是我在訂購記錄然後對它們進行分頁時遇到了問題。訂購然後用neo4j-will_paginate分頁

如果我嘗試:

@things = Thing.all.order(title: :desc) 

@things = Thing.all.paginate(:page => params[:page], :per_page => 20) 

這些做工精細獨立,但如果我嘗試

@things = Thing.all.order(title: :desc).paginate(:page => params[:page], :per_page => 20) 

它導致一個「未知的標識符`N`。 「錯誤

從軌服務器,產生了Cypher支架查詢是:

CYPHER 13ms MATCH (n:`Thing`) RETURN count(n) AS count ORDER BY n.title DESC 
Completed 500 Internal Server Error in 14ms 
Neo4j::Session::CypherError (Unknown identifier `n`.): 

我也試過

@things = Thing.all.paginate(:page => params[:page], :per_page => 2, :order => 'title DESC') 

哪個不給一個錯誤,但結果並不訂購。

我真的很感謝任何幫助,我可以得到!提前致謝!

回答

1

我是這個人,呃...這個很尷尬... 責怪這個問題。 neo4j-will_paginate寶石很快適應了Neo4jrb 3.0,因此,我一直在根據需要修補它,因爲它將它放在那裏。

無論如何,這有兩個原因是失敗的,它們都不是你的錯。我只是修補了Neo4j和neo4j-will_paginate寶石來解決這個問題。我添加了一個order選項,如您在上次嘗試中所演示的那樣,但您需要使用符號,散列或帶有標識符的字符串。其中的一個:

@things = Thing.all.paginate(:page => params[:page], :per_page => 2, :order => :title) 
@things = Thing.all.paginate(:page => params[:page], :per_page => 2, :order => { title: :desc }) 
@things = Thing.as(:t).paginate(:page => params[:page], :per_page => 2, :order => 't.title DESC') 

,直到我們做一個新的釋放neo4j,所以在此期間,無論是在每個回購的主分支指向您的Gemfile或裁判的注意,我不能做的neo4j-will_paginate新版本提交。

gem 'neo4j', github: 'neo4jrb/neo4j', branch: 'master', 
gem 'neo4j-will_paginate', github: 'neo4jrb/neo4j-will_paginate', branch: 'master' 

#or 

gem 'neo4j', github: 'neo4jrb/neo4j', ref: 'b4ee152becb827d87a7659d1beebfb043d0560f6' 
gem 'neo4j-will_paginate', github: 'neo4jrb/neo4j-will_paginate', ref: 'b85b622087f3929c37231570f4d24021dcff4ee0' 

我們爲Neo4j保留一個完全通過的主分支。

在將它直接固定在寶石中之前,我找出了問題的原因以及一個糟糕的解決方法並將其輸入。我將在這裏列出它,因爲它揭示了一些關於爲什麼會發生這種情況的信息,以及如何在Cypher DSL彈出時解決Cypher DSL的解決方法侷限性。最終,您在paginate中提出order選項的建議讓我瞭解如何正確處理它。


不必要的解決方法:

Thing.as(:t).where('true = true WITH t ORDER BY t.name desc').paginate(:page => params[:page], :per_page => 2) 

在Cypher支架,這產生兩個疑問:

MATCH (t:`Thing`) WHERE true = true WITH t ORDER BY t.name desc RETURN count(DISTINCT t) AS t 
MATCH (t:`Thing`) WHERE true = true WITH t ORDER BY t.name desc RETURN t SKIP 0 LIMIT 10 

務必注意的事實是,我們正在設置與標識as就在開頭。只要你在where方法中使用相同的東西,你可以設置任何你想要的。

所有必要的原因是因爲will_paginate計算出要顯示的頁面總數。當您撥打paginate時,您的查詢已調用count,正如您在第一次Cypher聲明中看到的那樣。現在,count錯誤已得到修復(編輯這個被列入前奏部分,在這裏我提到的修復導致您的特定錯誤的錯誤,但不是問題作爲一個整體),看起來像這樣:

MATCH (result:`Thing`) RETURN count(result) AS result ORDER BY result.name, result.desc 
# results in error: 
# Neo4j::Session::CypherError: Type mismatch: expected Map, Node or Relationship but was Integer (line 1, column 66) 

查詢和訂單明確了問題所在:您無法訂購整數。 WITH來救援! WITH基本上將我們的單個查詢分成兩個單獨的查詢。通常必須被稱爲RETURN的一部分的條款可以在那裏被調用。我們在那裏執行我們的訂單而不是最後,然後我們讓其餘部分按照通常的方式進行。

這是一個好主意,但這裏的問題是QueryProxyNeo4j::Core::Query類的抽象,並且沒有with方法。我們用那個廢話來解決這個問題。我們基本上使用針對服務器的Cypher注入攻擊。哎喲。

我想我可以通過修補寶石使用with解決這個問題...


在這一點上,我意識到它到底是如何工作的,停止打字,並修補了寶石。結束。我在https://github.com/neo4jrb/neo4j/issues/540上創建了一個問題,所以如果您遇到任何問題,請隨時發表評論。

+0

非常感謝您爲寶石修補!新的訂單選項完美地工作:) 我從'current_user'和devise-neo4j的其他方法,特別是'錯誤的參數數量(1爲0)'的錯誤。如果需要,我會嘗試深入挖掘並在github頁面上發佈。 – 50psi 2014-11-01 05:07:08