带有 ActionMailer 和复杂 activerecord 的 Rails (joins, where, and)



我想在注册项目(具有类别和符合条件的受众(时向每个创建警报的用户(具有相同的类别和相同的合格受众(发送电子邮件。

class Project
belongs_to :category
belongs_to :fondation
has_many :project_eligibles
has_many :eligibles, through: :project_eligibles
end
class Category
has_many :projects
has_many :alerts
end
class ProjectEligible
belongs_to :project
belongs_to :eligible
end
class Alert
belongs_to :user
belongs_to :category
belongs_to :eligible
end

邮件

class ProjectMailer < ApplicationMailer
def newproject(project)
@project = project
mail(
to:       mails = User.joins(:alerts).where(alerts: {category_id: project.category_id}).collect(&:email).join(","),
subject:  "New project for you !"
)
end
end

控制器

class ProjectsController < ApplicationController
def create
@project = Project.new(project_params)
if @project.save
ProjectMailer.newproject(@project).deliver_now
redirect_to projects_path
else
render :new
end
end
end

它适用于该类别,但我无法与符合条件的受众(many_to_many协会(一起使用:

def newproject(project)
@project = project
mail(
to:       mails = User.joins(:alerts).where(alerts: {eligible_id: project.project_eligibles.where(:eligible_ids)}).collect(&:email).join(","),
subject:  "New project for you !"
)
end
end

更困难的是,我不知道如何在 2 个条件下做到这一点?? 有人有测试的想法吗?

提前感谢您的帮助!

在你的ProjectMailer试试这个

project_elegibles = ProjectEligible.whare("project_id =?", @project.id).pluck(:eligible_id)
User.includes(:alerts).where("alerts.category_id =? and alerts.eligible_id IN (?)", @project.category_id, project_elegibles).pluck(:email)

了解我用来处理多对多关系的步骤。我无法在我的机器中对此进行测试,因为我没有代码。但这将有助于解决您的问题。

假设project = @project

mails = User.joins(:alerts).where("alerts.eligible_id IN (?) AND alerts.category_id = ?", project.project_eligibles.pluck(:eligible_id), project.category_id).pluck(:"users.email")

可能你应该使用left_outer_join

对于导轨 5.x.x

mails = User.left_outer_joins(:alerts).where("alerts.eligible_id IN (?) AND alerts.category_id = ?", project.project_eligibles.pluck(:eligible_id), project.category_id).pluck(:"users.email")