Повторное связывание дочернего объекта с другим родителем - Rails (2.3.11) удаляет связанный с has_many объект без операции sql - PullRequest
3 голосов
/ 17 мая 2011

Учитывая следующие определения

Foo
    has_many :bars, :dependent => :nullify, :autosave => false

Bar
    validates_presense_of :foo
    foo_id is not null # database constraint

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

Проблема в том, что когда я делаю что-то вроде

bar.foo.bars.delete(bar)
bar.foo = other_foo
other_foo.bars << bar

, я получаю ошибку, которая приbar.foo.bars.delete(bar) обновление sql выполняет обнуление свойства foo_id моего бара.Поэтому исключение sql ограничение и сбой.Вместо этого мне нужно, чтобы он просто работал все в памяти и не проходил проверку при необходимости.

Редактировать:

Дело в том, что все это в транзакции, поэтому меня не волнуют обновления БД, япросто не хочу, чтобы они вызывали проблемы с ограничениями базы данных, но я хочу, чтобы мои ограничения присутствовали и не допускали нулевое значение в БД для моего объекта Bar.Когда мое сохранение выполнится, если это удастся, я хочу, чтобы мое сохранение заново связало все соответствующим образом.Если это не удается, я хочу, чтобы моя модель памяти находилась в правильно обновленном (но не действительном) состоянии, и таким образом я могу отобразить свою страницу с обновленными значениями и сообщениями о том, что обновление не удалось.

Честно говоря, моя главная цель -иметь следующую ситуацию:

до:

foo1.bars => [bar1, bar2]
foo2.bars => [bar3]

после:

foo1.bars => [bar1]
foo2.bars => [bar3, bar2]

Поэтому моя главная цель - решить эту проблему (полное обновление в памятивсе соответствующие объекты), если это не связано с повторной ассоциацией, как у меня уже есть, я тоже приму это.

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Чтобы удалить связанный дочерний элемент (bar1) из родительской (foo1) коллекции баров, вы можете использовать

foo1.bars.delete_if{|b| b.id == bar1.id}

Это удалит bar1 из коллекции баров foo1, но bar1 останется неизменным в базе данных, потому что delete_if работает с Enumerable, на котором построен HasManyAssociation.

0 голосов
/ 17 мая 2011

Вы можете переопределить метод удаления или просто создать фильтр before_destroy. Rails документация

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