2009-09-10 2 views
0

Или, по-другому, есть ли причина не использовать его на всех моих моделях?Должно ли is_paranoid быть встроенным в Rails?

Некоторого фон: is_paranoid драгоценный камень, который делает звонки на destroy установленных в deleted_at метку времени, а не удалять строку (и вызовы find исключить строки с непустыми deleted_at с).

Я нашел эту функцию настолько полезной, что я начинаю включать ее в каждую модель - трудно удалить записи просто страшно. Есть ли причина, по которой это плохо? Если эта функция включена по умолчанию в Rails?

ответ

2

Ruby не для трусов, которые боятся своего кода!

В большинстве случаев вы действительно хотите полностью удалить запись. Рассмотрим таблицу, которая содержит отношения между двумя другими моделями. Это очевидный случай, когда вы не хотели бы использовать deleted_at.

Другое дело, что ваш подход к дизайну базы данных является своеобразным рубином. Вы будете страдать от необходимости обрабатывать все эти вещи deleted_At, когда вам приходится писать более сложные запросы к вашим таблицам, чем просто finds. И вы, безусловно, будете, когда DB вашего приложения занимает много места, поэтому вам придется заменить красивый и блестящий код ruby ​​на хакерские SQL-запросы. Вы можете захотеть отбросить этот столбец, но ... oops - вы уже использовали логику deleted_at, и вам придется переписать большие части вашего приложения. Попался.

И на последнем месте, на самом деле кажется естественным, когда вещи исчезают при удалении. И весь смысл моделирования заключается в том, что модели пытаются выразить на машиносчитываемых терминах то, что происходит там. По умолчанию вы удаляете запись, и она проходит вечно. И только причина deleted_at может быть естественной, когда запись должна быть позже восстановлена ​​или должна помешать аналогичной записи путать с исходной (таблица для пользователей, скорее всего, место, которое вы хотите использовать). Но в большинстве моделей это просто паранойя.

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

Конечно, есть несколько случаев, когда вы хотели бы вернуть удаление записей (особенно, когда случайное удаление ценных данных приводит к ненужным расходам). Но для его использования вам нужно будет изменить свое приложение, добавить формы и так далее, поэтому не составит труда добавить только еще одну линию к вашему классу модели. И, конечно же, есть и другие способы реализации хранения удаленных данных.

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

(Это влияние оказало влияние на ценные замечания railsninja).

+0

Это вздор. В моем ответе. – nitecoder

1

@Pavel Shved

Прошу прощения, но что? Рубин не для трусов, боящихся кода? Это может быть одна из самых смешных вещей, которые я когда-либо слышал. Конечно, в таблице соединений вы хотите удалить записи, но как насчет модели объединения, она может пройти много, а может и нет.

В бизнес-приложениях часто имеет смысл не просто удалять вещи, а пользователи делают ошибки, МНОГО.

Большая часть вашего ответа, Павел, - это своего рода трюк. Нет никакого стыда в использовании SQL, где вам нужно, и как использование deleted_at вызывает этот массивный рефакторинг, я в затруднении по этому поводу.

@Horace Я не думаю, что is_paranoid должен быть в ядре, не всем это нужно. Это фантастический камень, хотя я использую его в своих рабочих приложениях, и он отлично работает. Я также вполне уверен, что он не заставил меня прибегать к sql, когда мне это не нужно, и я не вижу большого рефакторинга в моем будущем из-за его присутствия. Используйте его, когда вам это нужно, но это должен быть камень.

+0

Ах, "Бизнес". Я должен почувствовать себя ребенком, услышав это и сразу же удалю свой ответ, верно? :-) Мои баллы были: (1) «Я боюсь» не является основанием для принятия решения; (2) есть определенные случаи, когда вы абсолютно не хотите is_paranoid; (3) Horace * вероятно * не знает, что писать SQL не стыдно и, возможно, думает, что ему это не понадобится. В то время как использование is_paranoid во всем мире затрудняло бы запись SQL SQL, даже если оно не используется. –

+0

Я согласен, что is_paranoid не должен быть в ядре. Ваш ответ не очень хорош, и снова, кто вы скажете, что записи должны быть окончательно удалены больше всего времени, это полностью ситуативно. Я не пытался заставить вас почувствовать себя ребенком, хотя вы действительно действуете как один. Моя точка зрения была в «бизнесе» кода, и данные не ваши, иногда лучше безопасны, чем жаль. Надеюсь, вы не ошибутесь слишком много людей. – nitecoder

+0

Хорошо, вы делаете несколько правильную точку, я добавлю пояснения к своему сообщению. –

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