Если вы на самом деле не заинтересованы в том, чтобы снова увидеть эти записи, но заботитесь только о том, чтобы потомки все еще существовали, когда родитель уничтожен, задание простое: добавьте :dependent => :nullify
к вызову has_many
, чтобы установить ссылки на автоматически уничтожить родительский элемент NULL
и научить представление справляться с отсутствующей ссылкой. Однако это работает только в том случае, если вы согласны с тем, что больше никогда не увидите строку, т. Е. При просмотре этих транзакций отображается «[NO LONGER EXISTS]» под названием компании.
Если вы действительно хотите снова увидеть эти данные, это звучит так, как будто то, что вы хотите, не имеет никакого отношения к фактическому уничтожению записей, что означает, что вам никогда не понадобится обращаться к их снова. Кажется, прятаться - путь.
Вместо переопределения уничтожения, поскольку вы на самом деле не уничтожаете запись, кажется, что значительно проще поместить ваше поведение в метод hide
, который вызывает флаг, как вы предложили.
Оттуда, когда вы хотите перечислить эти записи и включить только видимые записи, одно простое решение состоит в том, чтобы включить область действия visible
, которая не включает скрытые записи, и не включать ее, когда вы хотите найти эту конкретную запись, опять скрытая запись. Другой путь - использовать default_scope
, чтобы скрыть скрытые записи, и использовать Model.with_exclusive_scope { find(id) }
, чтобы найти скрытую запись, но я бы рекомендовал против этого, поскольку это может быть серьезным уловкой для начинающего разработчика и в корне меняет то, что Model.all
возврат к совсем не отражает то, что предлагает вызов метода.
Я понимаю желание заставить контроллеры выглядеть так, как будто они делают то, что делает Rails, но когда вы не действительно делаете то, что делает Rails, лучше об этом прямо говорить, особенно когда на самом деле это не такая уж большая боль.