Я использую mongoid для приложения, где пользователь является родительским документом, и почти вся другая информация встроена в пользователя.Так, например, мое действие контроллера #new
для Relationship
, принадлежащего пользователю, выглядит примерно так:
def new
@relationship = current_user.relationships.new(friend_id: params[:fid])
@relationship.validate
end
Поскольку я запускаю проверки отношений, которые будут отображаться в представлении и некоторых из них.валидации должны иметь возможность ссылаться на родителя, я не могу просто позвонить @relationship = Relationship.new(friend_id: params[:fid])
, но, создав экземпляр этого отношения в массиве отношений пользователя, он теперь там висит, даже если пользователь решит, что не хочет создаватьВ конце концов, новые отношения, и они переходят в другую часть сайта.Если они перейдут на страницу индекса взаимосвязи, они увидят ее в списке, если я не отфильтрую ее.
Если связь действительна, и они делают что-то еще в другом месте, что заставляет пользователя сохранить, эта фиктивная связьсейчас настоящий.Если он недействителен, сохранение завершится неудачей по неизвестным причинам.
У меня есть несколько моделей, которые я собираюсь встроить в пользователя, поэтому у меня будет эта проблема с каждой из них.
Я знаю, что могу позвонить current_user.reload
, чтобы избавиться от мусора, но мне кажется смешным, что мне придется обращаться к базе данных каждый раз, когда я хочу это сделать.Я мог бы также осиротить отношения после проверки, но это кажется хакерским.
Мне кажется, что это проблема, с которой люди должны постоянно сталкиваться со встроенными документами, так что я думаю, что будет какая-товстроенного решения, но я не могу найти его нигде.Я видел этот вопрос , который похож на мой, но я хочу что-то более расширяемое, чтобы мне не приходилось ставить его везде.
Я собираюсь создать модуль, который будет добавлять метод clear_unsaved_#{relation}
в класс для каждого встроенного отношения, но эта идея меня расстраивает, поэтому я хотел посмотреть, есть ли у кого-нибудь лучшее представление о том, каксделайте это, а также, где это лучше всего назвать.