Ruby on rails 然后订购neo4j-will_paginate

Ruby on rails 然后订购neo4j-will_paginate,ruby-on-rails,neo4j,will-paginate,Ruby On Rails,Neo4j,Will Paginate,我正在尝试用我的rails应用程序上的实现分页,但是我在排序记录然后分页时遇到了问题 如果我尝试: @things = Thing.all.order(title: :desc) 或 这些单独使用很好,但如果我尝试 @things = Thing.all.order(title: :desc).paginate(:page => params[:page], :per_page => 20) 它会导致“未知标识符`n`”错误 从rails服务器生成的密码查询是: CYPHER

我正在尝试用我的rails应用程序上的实现分页,但是我在排序记录然后分页时遇到了问题

如果我尝试:

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

这些单独使用很好,但如果我尝试

@things = Thing.all.order(title: :desc).paginate(:page => params[:page], :per_page => 20)
它会导致“未知标识符`n`”错误

从rails服务器生成的密码查询是:

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')
这不会给出错误,但结果不是有序的


我真的很感激能得到的任何帮助!提前谢谢

我是那个。。。这很尴尬。。。这一问题的罪魁祸首。
neo4j-will_paginate
gem很快就适应了neo4jrb3.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
发布新版本之前,我无法发布新版本的
neo4j-will\u paginate
,因此,在此期间,请将您的GEM文件指向每个回购的主分支或参考注意到的提交

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保留一个完全通过的主分支

在直接在gem中修复它之前,我找出了问题的原因和一个糟糕的解决方法,并将其打印出来。我将把它包括在这里,因为它揭示了一些关于为什么会发生这种情况的信息,以及当Cypher DSL出现时,您如何克服它们的限制。最后,您在
paginate
中建议的
订单
选项让我想到了如何正确处理它


不必要的解决方法:

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
方法中使用相同的内容,就可以设置任何需要的内容

之所以需要这样做,是因为
将如何计算要显示的总页数。当您调用
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
基本上将单个查询分隔为两个单独的查询。通常必须作为
返回的一部分调用的子句可以在那里调用。我们在那里执行我们的命令,而不是在最后,然后我们让它的其余部分,因为它通常会发挥出来

这是一个好主意,但这里的问题是
QueryProxy
Neo4j::Core::Query
类的抽象,没有
with
方法。我们通过
where('true=true…
胡说八道来解决这个问题。我们实际上是在对服务器使用密码注入攻击。哎哟

我想我可以通过将gem修补为使用
来解决这个问题



在这一点上,我完全意识到它的工作原理,停止键入,并修补了gem。结束。我在上创建了一个问题,因此如果您有任何问题,请随时在那里发表评论。

非常感谢您修补gem!新的订单选项非常有效:)我从
当前用户
和devise-neo4j的其他方法中得到错误,特别是
错误的参数数(1代表0)
。如果需要的话,我会尝试深入挖掘并在github页面上发布。
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)