У меня есть приложение, в котором мои пользователи могут иметь набор предпочтений.Оба хранятся в виде 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
) и избежать рекурсивнойназывает это так, но ради простоты в моем приложении, я хотел бы сохранить наименование.
Спасибо!