Ruby on rails 仅向特定用户发送电子邮件,Rails 5

Ruby on rails 仅向特定用户发送电子邮件,Rails 5,ruby-on-rails,ruby,ruby-on-rails-4,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 4,Ruby On Rails 5,我无法仅向布尔值设置为true的特定用户发送电子邮件爆炸,而无法向设置为false的用户发送电子邮件爆炸 在我的应用程序中,我有粉丝通过艺术家关系跟踪艺术家。在我的ArtistRelationship模型中,我有一个布尔值,粉丝们可以根据他们是否希望在艺术家发帖时收到来自艺术家的电子邮件爆炸设置为真或假 到目前为止,我有: artist.rb class Artist < ApplicationRecord def self.fan_post_email Artist.inl

我无法仅向布尔值设置为true的特定用户发送电子邮件爆炸,而无法向设置为false的用户发送电子邮件爆炸

在我的应用程序中,我有粉丝通过艺术家关系跟踪艺术家。在我的ArtistRelationship模型中,我有一个布尔值,粉丝们可以根据他们是否希望在艺术家发帖时收到来自艺术家的电子邮件爆炸设置为真或假

到目前为止,我有:

artist.rb

class Artist < ApplicationRecord

  def self.fan_post_email
    Artist.inlcudes(:fans).find_each do |fan|
      fan.includes(:artist_relationships).where(:post_email => true).find_each do |fan|
        FanMailer.post_email(fan).deliver_now
      end
    end
  end

end
class Artists::PostsController < ApplicationController

  def create
    @artist = current_artist
    @post = @artist.artist_posts.build(post_params)
    if @post.save
      redirect_to artist_path(@artist)
      @artist.fan_post_email
    else
      render 'new'
      flash.now[:alert] = "You've failed!"
    end
  end

end
class-Artisttrue)。查找每个粉丝|
FanMailer.发送电子邮件(fan).立即发送
结束
结束
结束
结束
posts\u controller.rb

class Artist < ApplicationRecord

  def self.fan_post_email
    Artist.inlcudes(:fans).find_each do |fan|
      fan.includes(:artist_relationships).where(:post_email => true).find_each do |fan|
        FanMailer.post_email(fan).deliver_now
      end
    end
  end

end
class Artists::PostsController < ApplicationController

  def create
    @artist = current_artist
    @post = @artist.artist_posts.build(post_params)
    if @post.save
      redirect_to artist_path(@artist)
      @artist.fan_post_email
    else
      render 'new'
      flash.now[:alert] = "You've failed!"
    end
  end

end
类艺术家::PostsController

我无法使用
fan\u post\u email
方法。我不完全确定如何在ArtistRelationship模型中找到布尔值设置为true的粉丝。

您想向特定艺术家的粉丝发送邮件。所以你打电话

@artist.fan_post_email
也就是说,您在Artister类的实例上调用一个方法。实例方法未使用
自身定义。[METHOD\u NAME]
。这样做定义了类方法(如果您想在何处调用,例如
Artist.foo

然后,第一部分是删除
self.
部分,第二部分是调整范围。完整的方法应如下所示:

def fan_post_email
  artists_relationships
    .includes(:fan)
    .where(post_email: true)
    .find_each do |relationship|
      FanMailer.post_email(relationship.fan).deliver_now
    end
  end
end
让我们浏览一下这个方法

我们需要得到所有的球迷,以便向他们发送邮件。这可以通过使用
artist\u关系
关联来实现。但是,由于我们只想让那些已经检查过电子邮件标志的粉丝,因此我们通过
where
语句来限制他们

产生的SQL条件将为我们提供所有此类关系。但是我们分批进行(
find_each
)以避免预先将所有记录加载到内存中

提供给
find\u each
的块是通过一个美工关系实例生成的。但是我们需要fan实例而不是artists\u relationships实例来发送我们块中的邮件,从而调用
post\u email
,并使用与关系关联的fan实例。为了避免N+1查询(一个接一个地查询每个美术师关系记录的粉丝记录),我们急切地在美术师关系上加载粉丝关联


与问题无关

在用户请求的正常请求/响应周期内使用该方法可能会大大降低应用程序的速度。如果一个艺术家有很多粉丝,应用程序将在为用户呈现响应之前向他们每个人发送一封电子邮件。如果它是一个受欢迎的艺术家,我可以很容易地想象这需要几分钟

deliver\u now
相对应的是
deliver\u later
(。作业,如发送电子邮件,可以独立于请求/响应周期进行排队和解析。这将需要设置一个类似or的工作人员,但性能的提高绝对值得

如果设置了排队机制,将调用移动到
fan\u post\u email
可能是有意义的,而且方法本身也可能需要一些时间


此外,以密件抄送的方式发送电子邮件可能是有意义的,这样您就可以同时向多个歌迷发送一封电子邮件。

您想向特定艺术家的歌迷发送邮件。因此,您可以拨打

@artist.fan_post_email
也就是说,您在Artister类的实例上调用了一个方法。实例方法不是用
self.[method\u NAME]
定义的。这样做定义了类方法(如果您在何处调用,例如
Artist.foo

然后,第一部分是删除
self.
部分,第二部分是调整范围。完整的方法如下所示:

def fan_post_email
  artists_relationships
    .includes(:fan)
    .where(post_email: true)
    .find_each do |relationship|
      FanMailer.post_email(relationship.fan).deliver_now
    end
  end
end
让我们浏览一下这个方法

我们需要让所有的粉丝向他们发送邮件。这可以通过使用
艺术家关系
协会来完成。但是,由于我们只想让那些粉丝检查电子邮件标志,我们通过
where
声明来限制这些粉丝

产生的SQL条件将为我们提供所有这些关系。但我们分批执行(
find_each
),以便不必预先将所有记录加载到内存中

提供给
find_each
的块是由美术家关系实例生成的。但是我们需要fan实例而不是美术家关系实例来发送块中的邮件,从而使用与关系关联的fan实例调用
post_email
。以避免N+1查询(一个接一个地查询每个艺人关系记录的粉丝记录)在那里,我们急切地在艺人关系上加载粉丝协会


与问题无关

在用户请求的正常请求/响应周期内使用该方法可能会大大降低应用程序的速度。如果一个艺术家有很多粉丝,应用程序会在为用户呈现响应之前向他们中的每一个人发送电子邮件。如果是一个受欢迎的艺术家,我可以很容易地想象这需要几分钟

deliver\u now
相对应的是
deliver\u later
(。作业,如发送电子邮件,可以独立于请求/响应周期进行排队和解析。这将需要设置一个类似or的工作人员,但性能的提高绝对值得

如果设置了排队机制,它可能会