vendredi 29 août 2008

Activerecord et les attributs virtuels

Le modèle CRUD ( create ,read , update ,delete) de Ruby on Rails est très simple.
Le framework mappe les tables avec des modèles par activerecord et mappe le modèle à un couple controleur/vue .

Le mapping repose sur la bijection : un champs de la table correspond à un attribut de l'objet Ruby.

Exemple : la table users avec les champs ''prenom',nom' et la clé 'id' se traduit par une vue avec un formulaire avec deux champs :"prenom " et "nom".

Mais il arrive parfois que l'on veuille parfois manipuler des attributs qui non pas d'existence réelle dans une table . Par exemple je veux traiter prenom et nom comme un champs unique : 'nom complet' , ou ajouter un champs uniquement destiné à la présentation dans un formulaire.

Plusieurs possibilités s'offrent à nous : soit traiter ce champs dans le contrôleur , soit l'ajouter comme un champs virtuel au modèle .

A mon avis la deuxieme solution est la meilleure car elle insère le virtuel au plus tot dans la logique de traitement. Et ainsi elle permet de bien regrouper tous les attributs au sein d'un même objet très flexible.

Pour cela il faut ajouter deux méthodes au modèle :

# models/user.rb
def nom_complet
[prenom, nom].join(' ')
end

def nom_complet=(chaine)
split = chaine.split(' ', 2)
self.prenom = split.first
self.nom = split.last
end
Le contrôleur et la vue pourront maintenant manipuler un troisième champs 'nom_complet' .

Une autre technique permet aussi de modifier le comportement mais pas le mappage des attributs :
les méthodes write_attribute et read_attribute d'activerecord

    def length=(minutes)
write_attribute(:length, minutes.to_i * 60)
end

def length
read_attribute(:length) / 60
end
Si les modifications à prévoir ne sont destinées qu'à l'affichage , il est préférable de d'utiliser des' helpers' mutualisables par plusieurs champs de meme type (exemple : les champs dates ou booleens ) .

voir une demo sur railscasts.

Aucun commentaire: