2014-01-09 4 views
1

У меня есть клиенты и счета-фактуры. Пользователи могут удалять клиентов, но не счета-фактуры.Rails удаляет родительскую модель, но все равно доступ к детям

Проблема заключается в том, когда клиент будет удален, я не могу больше делать

invoice.customer.name 

Поскольку клиент равен нулю.

У меня есть какое-то решение на доске для рисования

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

  2. Не удаляйте клиента, но скрывайте его от пользователя с помощью логического поля . Таким образом, экземпляр клиента все еще существует.

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

Какова наилучшая практика в этом случае?

(Если у вас есть лучшее решение, которое я хотел бы видеть его)

ответ

2

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

https://github.com/radar/paranoia

Это именно то, что ваш второй вариант и реализует все области, которые могут вам понадобиться.

+0

+1 для паранойи, кажется приятной маленькой жемчужиной, я не знал о благодарности! –

+0

Спасибо. У меня также есть класс фирмы. Это 'has_many: клиенты,: depend =>: destroy'. Вы знаете, как ведет себя паранойя, когда я удаляю фирму с вызовом 'act_as_paranoid' в классе клиента. –

+0

паранойя длиной всего 140 строк, поэтому я бы посоветовал вам прочитать ее, чтобы понять механику, лежащую за ней, https://github.com/radar/paranoia/blob/master/lib/paranoia.rb, кажется, Rails удалит но настройте delete_at на клиентов. – gmaliar

1

Ваше второе решение, кажется, лучше всего ИМО.

Вместо удаления клиента, ввести DELETED флаг на базу данных клиента (а затем добавить его в качестве default_scope игнорировать клиентов с DELETED = True)

таким образом, вы можете оставить отношения нетронутыми. если у вас есть грузы и грузы клиентов, вам может потребоваться подумать о архивировании mechansim, но я бы не стал беспокоиться об этом.

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