2012-07-23 67 views
2

我有一个JRuby on Rails应用与Neo4j.rb和模型,假设验证,这样的定义:的Neo4j ::导轨::型号to_json - 节点ID丢失

class Auth < Neo4j::Rails::Model 
    property :uid, :type => String, :index => :exact 
    property :provider, :type => String, :index => :exact 
    property :email, :type => String, :index => :exact 
end 

而且这样的代码:

a = Auth.find :uid => 324, :provider => 'twitter' 
# a now represents a node 
a.to_json 
# outputs: {"auth":{"uid": "324", "provider": "twitter", "email": "[email protected]"}} 

请注意,JSON表示中缺少该节点的ID。我的应用程序中有一个RESTful API,我需要该ID来执行DELETE和UPDATE操作。

我尝试这样做,看看它的工作原理:

a.to_json :only => [:id] 

但它返回一个空的JSON {}

有没有什么办法可以在不重写整个to_json方法的情况下获得JSON表示中节点的ID?

更新同样的问题也适用于to_xml方法。

谢谢!

回答

3

我在回答我自己的问题。我仍然认为有更好的方式来做到这一点,但是,现在,我使用下面的技巧:

/config/initializers/neo4j_json_hack.rb我把下面的代码:

class Neo4j::Rails::Model 
    def as_json(options={}) 
     repr = super options 
     repr.merge! '_nodeId' => self.id if self.persisted? 
    end 
end 

而现在的每一个JSON表示我坚持的Neo4j::Rails::Model对象具有_nodeId参数。

+1

我刚刚开始使用neo4j和neo4j.rb。我想知道为什么id不包括是json?如果我继续使用它,我可能会提交一个拉请求。另外,我想知道它是否应该被称为'id'以保持AR语义? – 2012-10-17 15:23:42

+1

我不知道为什么它不包括在内。你把它命名为'id'是对的。我实际上不记得我是否有一个合理的理由称之为_nodeId ... – 2012-10-24 20:36:35

1

该ID通常不包括在内,因为它不应暴露在Neo4j数据库之外。 Neo4j并不保证每个实例的ID都是相同的,如果在Neo4j的分布式企业安装中ID改变了,我不会感到意外。

您应该创建自己的ID(GUID?),将其保存为节点上的属性,对其进行索引,然后使用它来引用节点。不要将Neo4j ID暴露给您的用户或应用程序,并且绝对不要将其超过单个请求(例如,不要将其引用保存到另一个数据库中,或使用它来测试是否相等)。