Ho un'applicazione in cui i miei utenti possono avere una serie di preferenze. Entrambi vengono memorizzati come ActiveRecord-modelli come segue:Rails: crea un'associazione se non viene trovata alcuna corrispondenza per evitare errori nil
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
ora posso accedere alle preferenze di un utente:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
Ma questo non riesce se un insieme preferenza non è già stato creato, dal momento che @u. preferenza_set restituirà nil, e chiamerò play_sounds
su nil
.
Quello che voglio archiviare è che User.preference_set restituisce sempre un'istanza PreferenceSet. Ho provato a definire in questo modo:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
Questo sta causando un 'Stack level too deep'
, dal momento che sta chiamando se stessa in modo ricorsivo.
mia domanda è questa:
Come posso garantire che @user.preference_set
rendimenti sia corrispondente preference_set-record o, se non esiste, costruisce uno nuovo?
So che potrei semplicemente rinominare la mia associazione (ad esempio preference_set_real
) ed evitare le chiamate ricorsive in questo modo, ma per motivi di semplicità nella mia app, mi piacerebbe mantenere la denominazione.
Grazie!
Wow, non si era imbattuto alias_method_chain. Questo è figo. – Chowlett
Tieni presente che 'alias_method_chain' è stato deprecato a favore di' Modulo # anteporre'. Maggiori informazioni qui: https://github.com/rails/rails/pull/19434 –