Un element est-il présent dans un tablea u?

Bonjour,

Soient les relations suivantes :

  • forum has_many topics (et topic belongs_to forum)
  • topic has_many messages (et message belongs_to topic)
  • user has_many messages (et message belongs_to user)

Lorsque j’accède à la liste des messages d’un topic, je fais :
@[email protected]

Lors de l’affichage, pour les messages appartenant au “current_user”, je
veux proposer des options spéciales : éditer et supprimer. La question
est : comment savoir qu’un message appartient au current_user ?

Je compte procéder comme suit :

dans la classe message, créer la méthode suivante :

def belongs_to?(user_id)
begin
self.user_id == user_id
end

Ensuite, dans la vue, selon le resultat de
message.belongs_to?(current_user.id), j’afficherai ou pas les options
“edit” et “delete”.

Y a-t-il une meilleure solution, par exemple utilisant @messages et
current_user.messages, me permettant de m’affranchir de cette méthode
supplémentaire ?

Merci beaucoup !

gUI

Bonjour,

self.user_id == user_id
end

Comme ActiveRecord redéfini l’identité des objets, tu peut écrire
simplement

@message.user == current_user

Attention, cependant, ce test peut entraîner une requête
supplémentaire par message afin de charger l’objet user. Pour éviter
ça, il suffit de charger les users en même temps que les messages.

  • Soit dans la déclaration de l’association

topic has_many “messages” :include => [ User ]

  • Soit au moment de charger les messages

@messages = @topic.messages.find(:all, :include => [ User ])

Ensuite, dans la vue, selon le resultat de
message.belongs_to?(current_user.id), j’afficherai ou pas les options
“edit” et “delete”.

Y a-t-il une meilleure solution, par exemple utilisant @messages et
current_user.messages, me permettant de m’affranchir de cette méthode
supplémentaire ?

Une collection ActiveRecord répond aux même messages qu’un Array.
tu peut aussi utiliser :

current_user.messages.member?(@message)

Mourad

@message.user == current_user

Attention, cependant, ce test peut entraîner une requête
supplémentaire par message afin de charger l’objet user.
du coup, je me demande si il ne vaut pas mieux laisser les ids…

Une collection ActiveRecord répond aux même messages qu’un Array.
tu peut aussi utiliser :

current_user.messages.member?(@message)

je pense que c’est exactement ce que je cherchais !

niveau perfos, y aurait-il une version préférable entre l’utilisation de
member? et l’utilisation d’une méthode dédiée comme j’ai écris ?

merci (-:

gUI

(Le temps nécessaire va croître de façon linéaire en fonction du
nombre de messages)

Oui, mais concrètement on ne va pas s’attendre non plus à avoir des
milliers de messages (vu qu’il s’ait de messages de forums dans un seul
et meme topic). Et meme dans ce cas, il y aurait de la pagination qui
limiterait le nombre de messages à quelques dizaines.

En tous cas je te remercie beaucoup, je vais surement garder ma méthode
belongs_to mais maintenant je sais pourquoi (-:

gUI

On 25 mai, 12:43, Guillaume B. [email protected] wrote:

tu peut aussi utiliser :

current_user.messages.member?(@message)

je pense que c’est exactement ce que je cherchais !

niveau perfos, y aurait-il une version préférable entre l’utilisation de
member? et l’utilisation d’une méthode dédiée comme j’ai écris ?

merci (-:

Comparer les ids est clairement préférable pour ce qui concerne des
perfs.

Pour ce qui est de :

current_user.messages.member?(@message)
Cela nécessite

  • Une requête sql pour charger les messages de l’utilisateur
  • D’effectuer une recherche d’un message dans current_user.messages
    (Le temps nécessaire va croître de façon linéaire en fonction du
    nombre de messages)

Mourad