Neo4j :: Rails ::模型to_json - 缺少节点ID

时间:2012-07-23 23:42:30

标签: json serialization neo4j jrubyonrails activemodel

我有一个带有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方法。

谢谢!

2 个答案:

答案 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暴露给您的用户或应用程序,并且绝对不要在单个请求之外依赖它(例如,不要在另一个数据库中保存对它的引用或使用它来测试相等性)。