У меня есть приложение, в котором мои пользователи могут иметь набор настроек. Оба хранятся как модели ActiveRecord следующим образом:
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
Теперь я могу получить доступ к настройкам пользователя:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
Но это не удается, если набор предпочтений еще не создан, поскольку @u.preference_set будет возвращать nil, и я буду вызывать play_sounds
на nil
.
Что я хочу заархивировать, так это то, что User.preference_set всегда возвращает экземпляр PreferenceSet. Я пытался определить это так:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
Это вызывает 'Stack level too deep'
, так как он вызывает себя рекурсивно.
Мой вопрос таков:
Как я могу гарантировать, что @user.preference_set
вернет либо соответствующую запись preference_set, либо, если таковой не существует, создаст новую?
Я знаю, что могу просто переименовать свою ассоциацию (например, preference_set_real
) и таким образом избежать рекурсивных вызовов, но для простоты в моем приложении я хотел бы сохранить имя.
Спасибо!