2012-02-02 1 views
0

Je passais des heures à ce sujet et je ne peux pas l'obtenir:Emailing Tous les utilisateurs qui ont commenté sur un sujet de discussion

Ce que je suis en train de faire est; envoyer un courriel à tous les utilisateurs qui ont fait un commentaire sur un forum de discussion chaque fois qu'un nouveau commentaire est posté.

J'utilise user_mailer.rb

def new_post_from_buyer(post) 
    @post = post 
    users = User.all.posts.where(:project_id => post.project.id) 
    mail(:to  => '[email protected]', 
     :bcc  => #Somehow turn the users variable i just named into an array of their emails 
     :subject => 'The Project Poster Posted A New Comment') 
end 

Je le UserMailer.new_post_from_buyer (@post) .deliver correctement placé dans le posts_controller.rb

Donc il y a quelques choses qui doit arriver que je ne peux pas pour la vie de moi arriver à travailler avec succès.

1 - Je dois obtenir tous les utilisateurs dont les messages correspondent au projet en cours. (pour clarifier, un projet contient un forum de discussion dans lequel tous les messages vont) Le code actuel dans le mailer jette une méthode non définie pour les «messages», et tous les autres moyens que j'ai essayés ne fonctionneront pas.

2 - Je dois alors prendre les utilisateurs et extraire leurs e-mails (qui est une colonne dans la table des utilisateurs)

3 - Je dois alors être en mesure de prendre tous leurs e-mails et la transformer en un tableau séparés par des virgules donc je peux le jeter dans le: bcc du user_mailer.rb.

Comment voulez-vous que cela fonctionne? Une nouvelle façon avec .map ou une méthode dont je n'ai aucune idée, en corrigeant le code dont je pense avoir besoin?

Je cours Rails 3.1.

Pour être plus précis:

  • Messages has_many utilisateur.
  • Projet has_many Posts.
  • L'article appartient à l'utilisateur.
  • L'article appartient à Project.

Répondre

3

Cela peut ne pas être le moyen le plus efficace de le faire , comme il est généralement préférable commande la base de données à utiliser pour peigner les données, mais en fonction de vos modèles et les relations que vous pourriez utiliser des méthodes de rubis pour faire quelque chose comme ceci:

def new_post_from_buyer(post) 
    # This assumes that the attribute on the user that holds the email is called 'email' 
    array_of_user_emails = post.project.posts.map { |pos| pos.user.email } 
    mail(:to  => '[email protected]', 
     :bcc  => array_of_user_emails, 
     :subject => 'The Project Poster Posted A New Comment') 
end 

Je pense que vous étiez aussi sur la bonne voie dans votre tentative, j avec une syntaxe incorrecte.Cela pourrait en fait être un peu plus efficace:

def new_post_from_buyer(post) 
    # This assumes that the attribute on the user that holds the email is called 'email' 
    array_of_user_emails = User.includes(:posts).select(:email).where('posts.project_id = ?', post.project_id).map(&:email) 
    mail(:to  => '[email protected]', 
     :bcc  => array_of_user_emails, 
     :subject => 'The Project Poster Posted A New Comment') 
end 

Ce serait probablement encore plus efficace que mon premier exemple car il utilise SQL pour faire la recherche pour l'e-mail. Cela ne fonctionnerait que si vous utilisiez ActiveRecord avec une base de données SQL.

+0

Merci .. J'ai assumé le | pos | pos.user.email était supposé inclure le 't'. Votre solution a fonctionné! Merci .. Curieux; quand il a fait un tableau, a-t-il divisé chaque email avec une virgule? –

+0

@JamesF - Cela pourrait inclure le 't' mais ce n'est pas obligatoire. J'ai volontairement omis le 't' dans ce cas parce que l'argument pour la méthode est nommé 'post', et même si je ne pense pas qu'il y aurait dans la méthode' map' (puisque c'est dans son propre bloc) , Je ne voulais pas risquer de collision avec un nom de variable. Vous pouvez changer cela pour quelque chose comme '| a_post |' ou même 'post' comme vous avez suggéré d'être plus clair, je veux juste m'assurer que j'utilise des noms de variables différents pour éviter la collision de noms et pour la clarté. – Batkins

+0

Aussi, je recommanderais d'expérimenter avec la méthode 'map' de Ruby jusqu'à ce que vous ayez compris, c'est incroyablement utile, et vous aidera aussi à comprendre comment ruby ​​diverses méthodes ruby ​​fonctionnent avec des instructions' block'. [Voici un lien vers les documents pour la méthode 'map'] (http://ruby-doc.org/core-1.9.3/Array.html#method-i-map). – Batkins

1

Essayez:

def new_post_from_buyer(post) 
    @post = post 
    posts = Post.where(:project_id => post.project_id) 
    @users = [] 
    posts.each do |p| 
    @users << p.user.email 
    end 
    mail(:to  => '[email protected]', 
     :bcc  => @users 
     :subject => 'The Project Poster Posted A New Comment') 
end 

Cela générerait un tableau de tous les utilisateurs qui ont un poste pour ce projet.

Si vous voulez créer une chaîne à partir de ce tableau, je crois que vous avez juste besoin de faire @users.join(',')

EDIT: Code Inséré dans la méthode

+0

Salut. Où pourrais-je implémenter ceci? Je ne suis pas trop sûr de. Qu'est-ce que je mettrais dans la zone: bcc? Et j'aurais besoin de fermer le 'do', n'est-ce pas? –

+0

@JamesF Juste modifié pour l'inclure dans la méthode. Et oui, j'ai oublié de fermer la boucle – TheDude

+0

hey Bwalks, merci pour la réponse. J'ai décidé d'utiliser la réponse .map car j'ai besoin de travailler personnellement dessus. Je t'ai encore réadapté. –

Questions connexes