Eric :
globalement d’accord avec toi, mais je tiens à préciser certaines choses
Les différents cas :
- 1 (value = ‘ok’) : Tu vas créer ou utiliser une variable locale nommée
“value” et tu vas lui affecter ‘ok’
- 2 (self.value = ‘ok’) : Tu vas utiliser méthode d’instance (l’instance
étant “self”) nommée “value=” et tu vas lui passer ‘ok’ en paramètre
- 3 (@value = ‘ok’) : Tu vas créer ou utiliser une variable d’instance (ce
qu’on appelle ailleurs un attribut) et tu vas lui affecter ‘ok’
Ouais. C’est aussi l’occasion de lever une autre ambiguïté, cette
fois-ci les attributs.
Au sens Ruby du terme, les variables d’instance sont des attributs.
Au sens ActiveRecord du terme, les attributs correspondent aux
colonnes de la table correspondant au modèle.
Les attributs (au sens AR) sont stockés dans l’attribut (au sens
Ruby, variable d’instance) @attributes de ton modèle fille d’AR::B.
D’autre part, on peut très bien créer des attributs (au sens Ruby)
de son modèle, pour stocker des données qui ne seront pas
persistentes. Exemple : attr_accessor :password dans le
plugin acts_as_authenticated (seule la version chiffrée est
sauvée dans la base). Un exemple similaire dans l’Agile Book.
Enfin, AR utilise des attributs (au sens Ruby) pour stocker
l’état de l’objet (si l’enregistrement n’a pas encore été sauvé
dans la base, les erreurs…)
Ces histoires d’attributs peuvent entraîner une certaine
confusion quand on découvre les macros attr_reader, attr_accessor
attr_accessible, attr_protected…
Le cas (1) n’impacte pas ta base parce que c’est une variable
locale, à la fin de la méthode set_value() ta variable locale est
effacée/oubliée
Le cas (2) impacte ta base parce que tu utilises l’accesseur
automatique de active record qui est fait pour affecter des
données à partir de l’instance. Tu agis comme s’il s’agissait
d’une opération externe (utilisation de l’interface publique)
Le cas (3) peut fonctionner
Je ne crois pas !
si ActiveRecord utilise les attributs pour stocker les valeurs et
les relire (je crois que ça ne fonctionne plus mais je peux me
tromper).
Ah ! ça a fonctionné quand ? Je suis curieux, sur ce coup.
Tout est stocké dans @attributes.
Il s’agit cependant d’une procédure à éviter pour lire un attribut
de base dans un modèle ActiveRecord (si ça fonctionne ça
utilise de toutes façons un comportement privé qui changera
potentiellement à l’avenir).
Oui.
La bonne méthode est d’utiliser les fonctions
prévues pour, voir ci-dessous :
On a oublié aussi (5) self[:value] = ‘ok’
- si tu veux entrer une valeur brute sans vérification et interaction,
utilises le (4)
Ou le (5)
– Jean-François.