Framework de Programmation des Serveurs Web

Initiation à Ruby on Rails (RoR)

Olivier Dalle (@unice.fr)

Université de Nice Sophia Antipolis

Suivi des utilisateurs


On ajout une couche “Sociale” à l’application:

Suivi des utilisateurs


On ajout une couche “Sociale” à l’application:

Plan du cours


Mockup: Profile utilisateur courant

Mockup: Liste de tous les utilisateurs

Mockup: Profile d’un utilisateur à suivre

Mockup: Profile d’un utilisateur à Dé-suivre

Mockup: Page d’accueil avec feed

Modèle de données


On souhaite modéliser le suivi d’un utilisateur par un autre

Modèle de données


On souhaite modéliser le suivi d’un utilisateur par un autre

Une structure naive (à problème):

Problème avec la structure naive


Solution au problème


Posons-nous la question:

Solution au problème


Posons-nous la question:
Que crée l’action de suivre un nouvel utilisateur?

Résolution au problème


Posons-nous la question:
Que crée l’action de suivre un nouvel utilisateur?

Résolution au problème


Posons-nous la question:
Que crée l’action de suivre un nouvel utilisateur?

Résolution au problème


Posons-nous la question:
Que crée l’action de suivre un nouvel utilisateur?

Résolution au problème


Posons-nous la question:
Que crée l’action de suivre un nouvel utilisateur?

Résolution au problème


Posons-nous la question:
Que crée l’action de suivre un nouvel utilisateur?

→ On appelle cette table Relationship

Résolution au problème

La table followed_user répond au besoin, il suffit de l’utiliser comme relation:

Ayant déjà les id dans cette relation, il ne manque plus qu’une dernière opération pour obtenir des tableaux de followers et followed_users:

Résolution au problème

La table followed_user répond au besoin, il suffit de l’utiliser comme relation:

Ayant déjà les id dans cette relation, il ne manque plus qu’une dernière opération pour obtenir des tableaux de followers et followed_users:
c’est la relation has_many , :through :

has_many :followed_users, through: :relationships, source: :followed

La relation has_many , :through


Implémentation de la relation


La relation doit être sauvée dans une table et donc associée à un modèle:

Implémentation de la relation


La relation doit être sauvée dans une table et donc associée à un modèle:

rails generate model Relationship follower_id:integer followed_id:integer

Implémentation de la relation


La relation doit être sauvée dans une table et donc associée à un modèle:

rails generate model Relationship follower_id:integer followed_id:integer

Et il faut ajouter un index sur chaque colonne:

Associations User/relationship


Comme pour les micro-posts, on peut créer les relations via l’association dans la table user:

user.relationships.build(followed_id: ...)

Associations User/relationship


Comme pour les micro-posts, on peut créer les relations via l’association dans la table user:

user.relationships.build(followed_id: ...)

Mais d’abord les tests…

Tests unitaire sur la relation

spec/models/relationship_spec.rb

Mise-a-jour du test unitaire des utilisateurs

spec/models/user_spec.rb

Implémentation de l’association


app/models/user.rb

Test de l’association belongs_to


spec/models/relationship_spec.rb

Implémentation de l’association belongs_to


app/models/relationship.rb

Ajout des validations


D’abord les tests:

Ajout des validations


D’abord les tests:
spec/models/relationship_spec.rb

Ajout des validations


Puis l’implem:

Ajout des validations


Puis l’implem:
app/models/relationship.rb

Les utilisateurs suivis

spec/models/user_spec.rb

Les utilisateurs suivis


Implem:
Normalement on utiliserait une instruction t.q.:

has_many :followeds, through: :relationships

Mais “followeds” n’existe pas, donc on force rails à utiliser l’expression “followed_users”:

Ajout de méthodes utilitaires


Ajout de méthodes utilitaires


Ajout de méthodes utilitaires

spec/models/user_spec.rb

Ajout de méthodes utilitaires

app/models/user.rb

Ajout de méthodes utilitaires


Ajout de méthodes utilitaires

spec/models/user_spec.rb

Ajout de méthodes utilitaires

app/models/user.rb

Les suiveurs (followers)


Ajout d’une méthode user.followers pour accompagner user.followed_users

Les suiveurs (followers)


Ajout d’une méthode user.followers pour accompagner user.followed_users

On a besoin de la même table des relation (Relationships) mais en inversant le rôle des colonnes.

Les suiveurs (followers)

Les suiveurs (followers)

spec/models/user_spec.rb

Les suiveurs (followers)

spec/models/user_spec.rb

Les suiveurs (followers)


La relation inverse

Les suiveurs (followers)


La relation inverse

Les suiveurs (followers)


La relation inverse

app/models/user.rb