我想在注册项目(具有类别和符合条件的受众(时向每个创建警报的用户(具有相同的类别和相同的合格受众(发送电子邮件。
型
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")