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



我知道 gem 没有内置的方式来处理依赖破坏,但不像主动接收dependant: destroy

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

例如,现在我正在尝试处理我的Q + A的破坏问题。

每个问题

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

销毁问题可以这样做

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

event_question.destroy

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

写出一个更长的查询来处理查找问题和答案并一举销毁它们是否更好?(或...可以吗?我知道你不能像这样破坏查询代理(例如 event_question.answers.destroy

更新

我尝试使用删除来实现这两个查询,但删除没有执行。现在没有错误消息。窥探该方法,匹配项看起来正确。

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

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

我实际上做到了

answers = event_question.event_answers

然后循环它并销毁每个答案,这似乎破坏了答案和与问题的关系。Q+A是通过关联而不是ActiveRel设置的。不确定这是否有区别。

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

class EventQuestion
  before_destroy :destroy_answers
  def destroy_answers
    answers.each(&:destroy)
  end
end

显然,这不是最有效的,因为它对每个答案(即它自己的查询)进行销毁。 不过,它的优点是,答案上的所有之前/之后的销毁回调都将被调用。

如果你想用密码删除它们,你应该能够做answers(:a, :r).delete(:a, :r).exec

克里斯和公司正在为dependent destroy能力做公关。它目前似乎适用于宝石的主分支。它似乎可以完成这项工作 - 好吧!

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

最新更新