46 votes

Pourquoi n'est-il pas de soi toujours besoin de ruby / rails / activerecord?

Lors du test d'un getter/setter paire de rails de modèle, j'ai trouvé un bon exemple de comportement j'ai toujours pensé était bizarre et incohérent.

Dans cet exemple, je fais face à la class Folder < ActiveRecord::Base.

Folder belongs_to :parent, :class_name => 'Folder'

Sur la méthode de lecture, si j'utilise:

def parent_name
  parent.name
end

...ou...

def parent_name
  self.parent.name
end

...le résultat est exactement le même, j'ai le nom du dossier parent. Cependant, dans la méthode de lecture si j'utilise...

def parent_name=(name)
  parent = self.class.find_by_name(name)
end

... parent devient nul, mais si j'utilise...

def parent_name=(name)
  self.parent = self.class.find_by_name(name)
end

...puis ensuite, il travaille.

Donc, ma question est, pourquoi avez-vous besoin de déclarer l'auto.méthode parfois et pourquoi ne peut-il vous suffit d'utiliser une variable locale?

Il semble que le besoin de / utilisation de l' self dans ActiveRecord est incohérent, et j'aimerais comprendre mieux donc je n'ai pas l'impression que je suis toujours de savoir si je dois déclarer auto ou pas. Quand devriez-vous / devriez-vous pas utiliser soi dans ActiveRecord modèles?

82voto

pinkmexican Points 650

C'est parce que les attributs et les associations sont en fait des méthodes(getters/setters) et pas de variables locales. Lorsque vous l'état "parent = valeur" Ruby suppose que vous voulez affecter la valeur de la variable locale parent.

Quelque part vers le haut de la pile il y a une méthode de définition "def parent=" et de l'appel que vous devez utiliser "l'auto.parent = " dire ruby que vous voulez appeler un setter et pas seulement de définir une variable locale.

Quand il s'agit de getters Ruby regarde pour voir si il y a une variable locale d'abord et s'il ne peut pas le trouver, puis il essaie de trouver une méthode avec le même nom et qui est pourquoi votre méthode de lecture fonctionne sans "auto".

En d'autres termes, il n'est pas de la faute des Rails, mais c'est la façon dont Ruby œuvres par nature.

Espérons que cela aide.

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