Кеширование объекта ActiveRecord и ассоциаций - PullRequest
0 голосов
/ 05 апреля 2009

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

  1. Как выполнить глубокое клонирование (т. Е. .clone , но также клонировать все ассоциации вплоть до нижней части дерева ассоциаций)? До сих пор я предполагал, что мне придется написать свой собственный метод в модели.

  2. Как гарантировать, что ни один из клонированных экземпляров не выполнит обратную запись в базу данных, пока я не буду готов сделать это?

Если возможно, я бы хотел: -

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

  2. по-прежнему сможет обрабатывать каждый из клонов так, как если бы он был в базе данных (т.е. .find_by_id и т. Д. Будет работать)

Луна на палке возможно? ;)

Ответы [ 3 ]

1 голос
/ 05 апреля 2009

Не уверен на 100% в том, что вы пытаетесь сделать ...

Модели будут храниться в базе данных только при вызове метода сохранения. Вызов save в существующей модели обновит базу данных любыми данными, которые были изменены. Ассоциации также могут быть сохранены, но это действительно зависит от типа ассоциации, и в большинстве случаев вам, вероятно, придется также вызывать функцию сохранения для этих моделей.

0 голосов
/ 17 февраля 2010

Я решил наши проблемы глубокого клонирования с помощью плагина глубокого клонирования DefV: http://github.com/DefV/deep_cloning

Это сделано все, что я до сих пор требовал, хотя, как вы обнаружили, вы должны очень внимательно следить за своими отношениями. К счастью, мои тесты показали, что это проблема, и сейчас я работаю над этим. Я нашел этот пост, когда пытался его решить :)

Проверьте плагин, хотя, это было довольно удобно.

0 голосов
/ 05 апреля 2009

Doh! Иногда требуется задать глупый вопрос, прежде чем вы увидите очевидный ответ.

Моя проблема заключалась в том, что мне приходилось вносить изменения в связанные объекты, и они не появлялись, когда я позже использовал эти объекты в памяти, поэтому подумал, что мне нужно сохранить. Тем не менее, вы правы. Все, что на самом деле происходило, было то, что переменные, на которые они ссылались, вышли из области видимости, и поэтому вместо этого я получал доступ к базам данных в базе данных.

Я вернусь к своему коду и проверю, так ли это.

Сказав это, он не отвечает на мой вопрос о "глубоком клонировании, хотя" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...