Neo4j gem - 破坏相关节点和关系的有效方法

时间:2014-12-22 09:15:45

标签: ruby-on-rails neo4j destroy neo4j.rb

我知道gem没有内置的方法来处理依赖性破坏,但还有活跃的记录dependant: destroy

有没有更好的方法来处理链破坏?

例如,现在我正试图用我的Q + A来处理摧毁

每个问题都有很多答案,每个答案都有一个问题

破坏问题可以这样做

event_question = EventQuestion.find(params[:id])

event_question.destroy

但如果我需要处理答案,并且我通过这种关联来做,我必须循环并销毁每一个。一个额外的弱点是需要检查依赖节点/关系是否存在。

写出更长的查询来处理找到问题和答案并一举摧毁它们会更好吗? (或者......你能吗?)我知道你不能像这样破坏queryproxy(例如event_question.answers.destroy

更新

我尝试用delete实现这两个查询但是delete没有执行。现在没有错误消息。在方法中,匹配看起来正确。

event.users(:u,:rel).query.match("()-[r3]-u").delete(:r3).exec
event.event_questions(:q).event_answers(:a).query.match("event-[r0]-(), q-[r1]-(), a-[r2]-()").delete(:q, :a, :event).exec

更新2

这是第一个event.users的密码查询。

MATCH (event13:`Event`), (u:`User`), event13-[rel:`invited`]-(u:`User`), ()-[r3]-u WHERE ID(event13) = {ID_event13} DELETE r3"

看起来不错?但删除似乎没有执行。 附加asquery_as不允许查询在第二个上进行查询。它给了我未定义的方法as

最后更新

在转到其他问题之前的最后更新。

奇怪的是,我可以通过此

获得第一个删除关系的查询
event.users(:u,:r3).query.match("()-[r]-u").delete(:r3).exec

但是下一个查询不会删除问题和答案。

event.event_questions(:q).event_answers(:a).query.match("q-[r1]-(), a-[r2]-()").delete(:q, :a).exec

我不完全确定为什么需要匹配但没有它,它也不会执行。当我在我的Questions / Answers控制器上编写我的销毁函数时,我实际上不必删除该关系。但也许我做了一些时髦的事情。

我实际上是这样做的

answers = event_question.event_answers

然后循环并摧毁每个答案,这似乎破坏了答案和与问题的关系。 Q + A是通过关联设置的,而不是ActiveRel ..不确定是否会产生影响。

2 个答案:

答案 0 :(得分:2)

gem使用ActiveModel实现回调。所以你可以这样做:

class EventQuestion
  before_destroy :destroy_answers

  def destroy_answers
    answers.each(&:destroy)
  end
end

显然,这不是最有效的,因为它会对每个答案进行销毁,这是它自己的查询。它确实具有以下优点:将会调用答案的所有前/后销毁回调。

如果你想用cypher删除它们,你应该可以answers(:a, :r).delete(:a, :r).exec

答案 1 :(得分:0)

克里斯和公司正在研究dependent destroy能力的公关。它似乎目前在gem的master分支上工作。它似乎做了一个工作-ok!

https://github.com/neo4jrb/neo4j/pull/653