Neo4j 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"

Это выглядит правильно? Но удаление, похоже, не выполняется. Прикрепление as или же query_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.. не уверен, что это имеет значение.

2 ответа

Решение

Крис и компания работают над пиаром для dependent destroy способность. Кажется, в настоящее время работает над основной ветвью драгоценного камня. Похоже, делать работу -OK!

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

Gem реализует обратные вызовы с ActiveModel. Так что вы можете сделать:

class EventQuestion
  before_destroy :destroy_answers

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

Очевидно, что это не самый эффективный метод, поскольку он уничтожает каждый ответ, который является его собственным запросом. Преимущество в том, что будут вызываться все обратные вызовы до / после уничтожения в ответах.

Если вы хотите просто удалить их с помощью шифра, вы можете сделать answers(:a, :r).delete(:a, :r).exec

Другие вопросы по тегам