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!
Gem реализует обратные вызовы с ActiveModel. Так что вы можете сделать:
class EventQuestion
before_destroy :destroy_answers
def destroy_answers
answers.each(&:destroy)
end
end
Очевидно, что это не самый эффективный метод, поскольку он уничтожает каждый ответ, который является его собственным запросом. Преимущество в том, что будут вызываться все обратные вызовы до / после уничтожения в ответах.
Если вы хотите просто удалить их с помощью шифра, вы можете сделать answers(:a, :r).delete(:a, :r).exec