rails de défaut de priorité de lecture pour une relation (belongs_to)
Donc je sais comment remplacer la valeur par défaut des getters pour les attributs d'un ActiveRecord objet à l'aide de
def custom_getter
return self[:custom_getter] || some_default_value
end
Je suis en train de réaliser la même chose mais pour un appartient à l'association. Par exemple.
class Foo < AR
belongs_to :bar
def bar
return self[:bar] || Bar.last
end
end
class Bar < AR
has_one :foo
end
Quand je dis:
f = Foo.last
J'aimerais avoir la méthode f.bar
de retour de la dernière Barre, plutôt que le néant si cette association n'existe pas encore.
Cela ne fonctionne pas, cependant. La raison en est que l'auto [bar] est toujours pas défini. C'est en fait l'auto[:bar_id].
Je peux faire quelque chose de naïf comme:
def bar
if self[:bar_id]
return Bar.find(self[:bar_id])
else
return Bar.last
end
end
Toutefois, cela fera toujours un db d'appel, même si la Barre a déjà été récupérés, ce qui n'est certainement pas idéal.
Quelqu'un aurait-il une idée de comment je pourrais avoir une relation telle que la belongs_to attribut n'est chargée qu'une seule fois et a une valeur par défaut si non définie.
Vous devez vous connecter pour publier un commentaire.
alias_method est votre ami ici.
La façon dont cela fonctionne est que vous alias par défaut "bar" méthode "original bar" et ensuite mettre en place votre propre version de "bar". Si l'appel à original_bar retourne nil puis vous retournez la dernière occurrence de Barre à la place.
stack level too deep error
original_bar || Bar.last
super || Bar.last
j'ai trouvé que l'utilisation de "super" est la meilleure façon
J'espère que cela vous aide à vous 😀
Randy, la réponse est sur place, mais il y a un moyen plus facile de l'écrire, à l'aide de alias_method_chain:
Qui crée deux méthodes -
bar_with_default_find
etbar_without_default_find
et aliasbar
à lawith
méthode. De cette façon, vous pouvez appeler explicitement un ou l'autre, ou tout simplement laisser les valeurs par défaut comme c'est._without_default_find
pour avoir une idée de l'origine de l'association de la méthode. Était le seul que j'ai pu obtenir un travail. Merci