55 votes

les rails écrasent le getter par défaut pour une relation

Donc, je sais comment faire pour remplacer la valeur par défaut des getters pour les attributs d'un objet à l'aide d'ActiveRecord

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.

78voto

Randy Simon Points 2387

alias_method est votre ami ici.

 alias_method :original_bar, :bar
def bar
  return self.original_bar || Bar.last
end
 

La façon dont cela fonctionne est que vous appelez la méthode "barre" par défaut "barre originale", puis implémentez votre propre version de "barre". Si l'appel à original_bar renvoie nil, vous renvoyez à la place la dernière instance de Bar.

10voto

Cory Foy Points 5181

La réponse de Randy est parfaite, mais il existe un moyen plus simple de l'écrire, en utilisant alias_method_chain:

 
def bar_with_default_find
  return 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 les alias bar de 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X