ActionMalier Rails: отправьте электронное письмо пользователю в соответствии с критериями (многие ко многим) - PullRequest
0 голосов
/ 13 ноября 2018

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

MODEL

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 Publication
  belongs_to :user
  belongs_to :category
  belongs_to :eligible
end

class User
  has_many :favorites
  has_many :favorite_projects, through: :favorites, source: :favorited, 
  source_type: 'Project'
  has_many :publications
end

MAILER

class ProjectMailer < ApplicationMailer
  def newproject(project)
    @project = project
    proj_elig = ProjectEligible.where('project_id =?', project.id).pluck(:eligible_id)
    mails = User.includes(:publications).where("publications.eligible_id IN (?) AND publications.category_id = ?", proj_elig, project.category_id).pluck(:email)
      mail(
        to: mails,
        subject:  "A new project for you !"
      )
  end
end

КОНТРОЛЛЕР (проект)

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

private

      def project_params
        params.require(:project).permit(:title, :description, :link, :expiration, 
        :all_tags, :category_id, :fondation_id, eligible_ids: [])
      end

    end

ProjectMailer работает с категорией, но не с project_elptable. Например, если пользователь хочет получить электронное письмо, как только проект будет создан с category_id 1 и elptable_id 1:

#<Publication:0x007fe089425010
 id: 17,
 user_id: 1,
 category_id: 1,
 eligible_id: 1,
 created_at: Sun, 04 Nov 2018 17:08:52 UTC +00:00,
 updated_at: Sun, 04 Nov 2018 17:08:52 UTC +00:00>

Я создаю проект:

Project.create!(
  title: "test title", 
  description: 'sample description', 
  expiration: "2018-11-14", 
  category_id: 1 , 
  fondation_id: 1,
  eligible_ids: [1,2]
)

Если я проверю: проект создан:

#<Project id: 481, title: "test title", description: "sample description", link: nil, expiration: "2018-11-14", category_id: 1, fondation_id: 1, created_at: "2018-11-13 09:15:01", updated_at: "2018-11-13 09:15:01">

Но права проекта странные, они не сохраняются:

#<ActiveRecord::Associations::CollectionProxy [#<ProjectEligible id: nil, project_id: nil, eligible_id: 1, created_at: nil, updated_at: nil>, #<ProjectEligible id: nil, project_id: nil, eligible_id: 2, created_at: nil, updated_at: nil>]>

и proj_elig пуст: []

Но после этого, если в терминале, я проверяю Project.last.project_eligibles: Я нахожу свой проект (id: 398) с моим 2 elptable_id (1 и 2):

[#<ProjectEligible:0x007fe08d010d40
  id: 398,
  project_id: 481,
  eligible_id: 2,
  created_at: Tue, 13 Nov 2018 09:15:01 UTC +00:00,
  updated_at: Tue, 13 Nov 2018 09:15:01 UTC +00:00>,
 #<ProjectEligible:0x007fe08d010048
  id: 397,
  project_id: 481,
  eligible_id: 1,
  created_at: Tue, 13 Nov 2018 09:15:01 UTC +00:00,
  updated_at: Tue, 13 Nov 2018 09:15:01 UTC +00:00>]

Возможно ли, что запись project_elitable задерживается по отношению к проекту, поэтому она всегда будет считаться пустой в ActionMailer?

Как мне убедиться, что project_elptables зарегистрировано, а proj_elig не пусто?

Спасибо за ваш совет! Я немного растерялся ....

...