Ruby on Rails ส่งอีเมลหลายฉบับพร้อมกัน

โอเค ในแอปพลิเคชัน RoR ของฉัน ฉันมีระบบภาพยนตร์ที่ผู้ใช้ตั้งค่าได้ ซึ่งรวมถึงการบันทึกนักแสดงคนโปรดด้วย สิ่งที่ฉันพยายามทำคือรับมัน เพื่อว่าเมื่อมีการเพิ่มภาพยนตร์เรื่องใหม่ หากผู้ใช้มีนักแสดงของภาพยนตร์เรื่องใดที่บันทึกไว้เป็นรายการโปรด พวกเขาจะได้รับอีเมลแจ้งเตือนเกี่ยวกับภาพยนตร์เรื่องนี้

ในนาทีนี้ ฉันสามารถรับมันได้ โดยการใช้คำสั่งwhere เมื่อมีการเพิ่มภาพยนตร์ ผู้ใช้คนแรกในอาร์เรย์จะถูกส่งทางอีเมล films_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
และนี่จะอยู่ใน films_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
สิ่งนี้จะทำให้เกิดข้อผิดพลาดเนื่องจากคุณกำลังส่งการตั้งค่า obj เป็นอาร์กิวเมนต์แรกของ favourite_actor วิธีซึ่งคาดว่าผู้ใช้ obj - person RAJ; 09.04.2015