发送电子邮件给讨论主题发表评论的所有用户

问题描述:

我在这个上花了几个小时,而我却不明白:发送电子邮件给讨论主题发表评论的所有用户

我在做什么;只要发布新评论,即可通过电子邮件向在论坛上发表评论的所有用户发送电子邮件。

我使用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 

我.deliver正确安放在posts_controller.rb的UserMailer.new_post_from_buyer(@post)

所以这是有几件事情要发生,我不能为我的生活成功地工作。

1 - 我必须让所有帖子与当前项目相匹配的用户。 (为了澄清,一个项目包含一个讨论区,其中所有帖子都放在该讨论区)邮件程序中的当前代码抛出'posts'的未定义方法,并且我尝试过的其他所有方法都不起作用。

2 - 然后我必须采取那些用户和提取他们的电子邮件(这是在用户表中的列)

3 - 我需要然后能够采取其的所有电子邮件并把它变成一个数组以逗号分隔,所以我可以将它放在user_mailer.rb的:bcc中。

你将如何去实现这个工作?一个新的方式与.map或一些我不知道的方法,修复我认为我需要的代码?

我正在运行Rails 3.1。

为了进一步阐明:

  • 用户的has_many帖子。
  • 项目has_many文章。
  • 发布belongs_to用户。
  • 发布belongs_to项目。

这可能不是最有效的方式做到这一点,因为它是通常最好使用数据库命令来梳理数据,但根据您的模型和关系,你可以使用Ruby的方法做这样的事情:

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 

我想你也分别在正确的轨道上你尝试,j错误的语法。这实际上可能是多一点效率:因为它使用SQL做搜索的电子邮件

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 

这可能甚至比我的第一个例子更有效率。这只有在您将ActiveRecord与基于SQL的数据库结合使用时才有效。

+0

谢谢..我认为| pos | pos.user.email假设包含't'。你的解决方案工作谢谢你好奇;当它创建一个数组时,它是否用逗号分隔每个电子邮件? – 2012-02-02 16:17:56

+0

@JamesF - 它可能包括't',但它不必。在这种情况下,我实际上故意省略了't',因为该方法的参数名为'post',即使我不认为在map方法中会有内容(因为它位于它自己的块中) ,我不想冒任何变量名称冲突的风险。你可以把它改成像'| a_post |'或者甚至是'post'这样的东西,就像你建议的更清晰一样,我只是想确保我使用不同的变量名称来避免名称冲突和读取时的清晰度。 – Batkins 2012-02-02 16:23:47

+0

另外,我会建议试用Ruby的'map'方法,直到你掌握它为止,这是非常有用的,并且还将帮助你理解ruby各种ruby方法如何与'block'语句一起工作。 [这是一个链接到'map'方法的文档](http://ruby-doc.org/core-1.9.3/Array.html#method-i-map)。 – Batkins 2012-02-02 16:27:17

尝试:

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 

这将产生所有谁拥有该项目后的用户的数组。

如果你想创建这个数组一个字符串,我相信你会需要做的仅仅@users.join(',')

编辑:插入的代码添加到方法

+0

嗨。我会在哪里实施这个?我不太确定。我会把什么放在:密件抄送区?我需要关闭'做',对吧? – 2012-02-02 16:13:07

+0

@JamesF刚编辑它将其包含在方法中。而且,我忘了关闭循环 – TheDude 2012-02-02 16:17:00

+0

嘿Bwalks,谢谢你的答案。我决定使用.map答案,因为我需要亲自处理它。我还是把你录下来。 – 2012-02-02 16:30:36