Donc, je sais comment remplacer les getters par défaut pour les atsortingbuts d’un object ActiveRecord en utilisant
def custom_getter return self[:custom_getter] || some_default_value end
J’essaie de réaliser la même chose cependant pour une appartenance à 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 que la méthode f.bar
retourne la dernière barre, plutôt que nil si cette association n’existe pas encore.
Cela ne fonctionne pas cependant. La raison en est que self [: bar] est toujours indéfini. C’est en fait moi-même [: 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
Cependant, cela fera toujours un appel à la firebase database, même si Bar a déjà été récupéré, ce qui n’est certainement pas idéal.
Est-ce que quelqu’un a une idée de la façon dont je pourrais avoir une relation telle que l’atsortingbut belongs_to ne soit chargé qu’une fois et a une valeur par défaut s’il n’est pas défini.
alias_method est votre ami ici.
alias_method :original_bar, :bar def bar self.original_bar || Bar.last end
La façon dont cela fonctionne est que vous alias la méthode par défaut “bar” en tant que “barre originale” et ensuite implémentez votre propre version de “bar”. Si l’appel à original_bar renvoie nil alors vous retournez la dernière instance de Bar à la place.
J’ai trouvé que l’utilisation de “super” est le meilleur moyen
def bar super || Bar.last end
J’espère que cela vous aide: D
La réponse de Randy est exacte, mais il existe un moyen plus simple de l’écrire, en utilisant alias_method_chain:
def bar_with_default_find self.bar_without_default_find || Bar.last end alias_method_chain :bar, :default_find
Cela crée deux méthodes: bar_with_default_find
et bar_without_default_find
et aliases bar
à la méthode with
. De cette façon, vous pouvez appeler explicitement l’un ou l’autre, ou simplement laisser les valeurs par défaut telles quelles.