我有一个带有Neo4j.rb的Jruby on Rails应用程序和一个模型,让我们说Auth,定义如下:
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@example.com"}}
请注意,JSON表示中缺少节点的ID。我的应用程序中有一个RESTful API,我需要id来执行DELETE和UPDATE操作。
我试过这个看看它是否有效:
a.to_json :only => [:id]
但它返回一个空的JSON {}
。
有没有办法在不重写整个to_json
方法的情况下获取JSON表示中节点的ID?
更新同样的问题也适用于to_xml
方法。
谢谢!
答案 0 :(得分: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
现在,我持久化Neo4j::Rails::Model
个对象的每个JSON表示都有一个_nodeId
参数。
答案 1 :(得分:1)
通常不包括ID,因为它不应暴露在Neo4j数据库之外。 Neo4j不保证ID在实例之间是相同的,如果在Neo4j的分布式企业安装中更改了ID,我也不会感到惊讶。
您应该创建自己的ID(GUID?),将其保存为节点上的属性,对其编制索引,并使用它来引用您的节点。不要将Neo4j ID暴露给您的用户或应用程序,并且绝对不要在单个请求之外依赖它(例如,不要在另一个数据库中保存对它的引用或使用它来测试相等性)。