Ruby on Rails, отправляйте несколько писем одновременно

Хорошо, в моем приложении RoR у меня есть система кинотеатра, в которой у пользователей есть предпочтения, в том числе сохранение их любимого актера. Что я пытаюсь сделать, так это сделать так, чтобы при добавлении нового фильма, если пользователи сохранили любого из актеров фильма как своего любимого, они получили электронное письмо с уведомлением о фильме.

На данный момент я могу сделать так, чтобы с помощью оператора where при добавлении фильма ПЕРВЫЙ пользователь в массиве получал электронное письмо, film_controller:

def create
    @film = Film.new(film_params)
    if @film.save
        if not @film.cast1.blank?
            user1 = Perference.where(actor: @film.cast1).first.user
            if not user1.blank?
                actor = @film.cast1
                FavouriteActor.favourite_actor(user1, actor).deliver
            end
        end
        if not @film.cast2.blank?
            user2 = Perference.where(actor: @film.cast2).first.user
            if not user2.blank?
                actor = @film.cast2
                FavouriteActor.favourite_actor(user2, actor).deliver
            end
        end
        if not @film.cast3.blank?
            user3 = Perference.where(actor: @film.cast3).first.user
            if not user3.blank?
                actor = @film.cast3
                FavouriteActor.favourite_actor(user3, actor).deliver
            end
        end
        redirect_to @film
    else
        render 'new'
    end
end

Затем это отправляется почтовой программе favourite_actor.rb:

class FavouriteActor < ApplicationMailer
 def favourite_actor(user, actor)
    @user = user
    @actor = actor
    @url  = 'http://localhost:3000/films'
    mail(to: @user.email, subject: 'Your favourite actor stars in a new film')
 end
end

Который затем отправляет электронное письмо favourite_actor.html.erb

Но что я могу сделать, чтобы заменить эти строки, такие как: user1 = Perference.where(actor: @film.cast1).first.userчтобы все пользователи, у которых этот актер является их любимым, отправлялись по электронной почте?


person Community    schedule 09.04.2015    source источник


Ответы (2)


Вам нужно немного обновить свои запросы:

preferences = Preference.where(["actor = ? OR actor = ? OR actor = ?", @film.cast1, @film.cast2, @film.cast3]).includes(:user)

preferences.each do |preference|
  FavoriteActor.favourite_actor(preference.user, actor).deliver
end
person RAJ    schedule 09.04.2015
comment
И это пойдет в film_controller? - person ; 09.04.2015
comment
Я получаю эту ошибку: undefined method include' для #‹Perference::ActiveRecord_Relation:0x6c84a98›`, и у вас также есть случайный '[' в первой строке - person ; 09.04.2015
comment
Ой! опечатка. Исправил. Должно быть includes - person RAJ; 09.04.2015
comment
Теперь я получаю эту ошибку: Association named 'users' was not found on Perference; perhaps you misspelled it? - person ; 09.04.2015
comment
Я получаю вышеуказанную ошибку, но между ними есть правильные ассоциации - person ; 09.04.2015
comment
Вам нужно написать user вместо users - person RAJ; 09.04.2015

Возможно, попробуйте что-то вроде:

users = Preference.where(actor: @film.cast1)
users.each do |user|
  FavoriteActor.favourite_actor(user, actor).deliver
end

Если я правильно понимаю, что вы хотите сделать, это найдет всех пользователей с этим любимым актером, переберет набор и отправит электронное письмо каждому.

person Adam Bronfin    schedule 09.04.2015
comment
Это вызовет ошибку, так как вы передаете объект предпочтения в качестве первого аргумента метода favourite_actor, который ожидает пользователя obj - person RAJ; 09.04.2015