Rails с ActionMailer и комплексной активной записью (соединения, где и) - PullRequest
0 голосов
/ 24 июня 2018

Я хотел бы отправить электронное письмо при регистрации проекта (с категорией и приемлемой аудиторией) каждому пользователю, который создал оповещение (с той же категорией и такой же приемлемой аудиторией).

МОДЕЛЬ

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 ]

0 голосов
/ 25 июня 2018

Предполагается, 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.xx

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")
0 голосов
/ 24 июня 2018

Попробуйте это в вашем 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)

Поймите шаги, которые я использовал, чтобы справиться с отношениями "многие ко многим". Я не могу проверить это на своей машине, так как у меня нет кода. Но это поможет исправить вашу проблему.

...