2012-05-04 4 views
2

У меня есть процесс глубокого клонирования в моем приложении rails, а также процесс рекурсивного удаления, который удаляет узел дерева и его потомков и их ассоциации. Обе эти процедуры имеют проблемы, когда: touch => true применяется к отношениям. Это нормально, когда мы просто обновляем одну запись, чтобы изменение коснулось всех родительских записей ассоциациями и древовидной структурой, но когда мы имеем дело с массовым созданием или удалением, имеет смысл отключить прикосновение к длительности этого вызова.Отключить прикосновение к длительности блока в ActiveRecord

Я ищу направление вокруг того, как бы я определил метод, который принимает блок для запуска кода, который не активировал бы сенсорный метод для объектов.

Я думаю, возможно, только перед уступкой я должен установить глобальное? переменная, указывающая, что касание отключено, а затем переопределить метод касания, чтобы сначала проверить эту переменную перед вызовом супер (или не так, как в случае с этим).

Любая помощь, чтобы закрепить это в фактическом коде, будет оценена по достоинству. :)

+0

Привет! Как вы в итоге подошли к этому? Я рассматриваю аналогичный случай для тестирования: http://stackoverflow.com/questions/18922864/how-to-disable-belongs-to-touch-option-in-rspec-tests-for-rails-models – dgilperez

+0

Я никогда обошел это. Я просто должен был согласиться с тем, что обновление происходит очень медленно, и ошибка при удалении, если что-то не выполняется в правильном порядке. Rails 3 лучше в том, что он не пытается сохранить всю модель, просто обновите временные метки в изоляции, что намного лучше. Нет такой удачи для Rails 2, где этот проект все еще застрял! : D –

ответ

0

Похоже, что это может стать довольно волосатым, пытаясь придумать способ сделать это в целом. Когда вы объявляете ассоциацию belongs_to с опцией :touch, она создает новый метод объединения, который вы хотите коснуться, который обрабатывает касание, если сохранение/обновление/уничтожение успешно. Если вы все еще хотите отправиться вперёд, взгляните на add_touch_callbacks, который определяет это определение метода и его подключение.

Я предполагаю, что моя точка атаки будет идентифицировать связанные с ней ассоциации, затем переопределить их определения методов пустым методом, перейти к блоку, а затем все переопределенные определения методов были вставлены на место, поэтому трогательно снова работает.

+0

Я согласен с этим, хотя я никогда не пытался это попробовать. Я собираюсь задать вопрос о области rails github о том, чтобы сделать сенсор более эффективным, только обновив временные метки и выполнив только связанные обратные вызовы, вместо сохранения всего объекта. –

Смежные вопросы