Tengo una aplicación donde mis usuarios pueden tener un conjunto de preferencias. Ambos se almacenan como ActiveRecord-modelos de la siguiente manera:Rieles: Crear asociación si no se encuentra ninguno para evitar errores nulos
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
que ahora pueden acceder a las preferencias de un usuario:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
Pero esto no funciona si un conjunto de preferencias no se ha creado, ya que @u. preference_set devolverá nil, y llamaré al play_sounds
en nil
.
Lo que quiero archivar es que User.preference_set siempre devuelve una instancia de PreferenceSet. He intentado definir así:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
Esto está causando un 'Stack level too deep'
, ya que está llamando a sí mismo de forma recursiva.
Mi pregunta es la siguiente:
¿Cómo puedo asegurar que @user.preference_set
devuelve o el correspondiente preference_set-registro o, si no existe, se construye una nueva?
Sé que podría cambiar el nombre de mi asociación (por ejemplo, preference_set_real
) y evitar las llamadas recursivas de esta manera, pero por simplicidad en mi aplicación, me gustaría mantener el nombre.
Gracias!
Vaya, no había llegado a través de alias_method_chain. Eso es genial. – Chowlett
Tenga en cuenta que 'alias_method_chain' ha quedado en desuso en favor de' Module prepend de'. Más información aquí: https://github.com/rails/rails/pull/19434 –