J'ai une application où mes utilisateurs peuvent avoir un ensemble de préférences. Les deux sont stockées sous forme de modèles ActiveRecord-comme suit:Rails: Créer une association si aucun n'est trouvé pour éviter les erreurs nulles
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
Je peux maintenant accéder aux préférences d'un utilisateur:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
Mais échoue si un ensemble de préférence n'est pas déjà créé, depuis @u. preference_set retournera zéro, et je vais appeler play_sounds
sur nil
. Ce que je veux archiver, c'est que User.preference_set renvoie toujours une instance de PreferenceSet. Je l'ai essayé de le définir comme ceci:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
Cela provoque une 'Stack level too deep'
, car il appelle lui-même récursive.
Ma question est la suivante:
Comment puis-je faire en sorte que ce soit le @user.preference_set
retours preference_set-enregistrement ou, si aucune existe correspondante, construit un nouveau?
Je sais que je pourrais simplement renommer mon association (par exemple preference_set_real
) et éviter les appels récursifs de cette façon, mais par souci de simplicité dans mon application, je voudrais garder le nom.
Merci!
Wow, n'a pas rencontré alias_method_chain. C'est super. – Chowlett
Soyez avisé que 'alias_method_chain' a été abandonné en faveur de' Module # prepend'. Plus d'infos ici: https://github.com/rails/rails/pull/19434 –