2009-08-21 25 views
2

看看下面的簡單對象模型,例如:ActiveRecord:對象可以添加到一個has_many:通過一個批處理操作?

class Course 
    has_many :enrollments 
    has_many :students, :through => :enrollments, :after_add => :send_email 

    def send_email(student) 
    puts "Email Sent" 
    end 
end 

class Enrollment 
    belongs_to :course 
    belongs_to :student 
end 

class Student 
    has_many :enrollments 
    has_many :courses, :through => :enrollments 
end 

我想一個或更多的學生加入到課程後進行send_email,但是after_add每個項目添加到收藏的學生之後被激發。

bill = Student.first 
carl = Student.last 

Course.first.students << [bill, carl] 

將輸出

Email Sent 
Email Sent 

我如何能趕上一個單一事件後的所有項目添加到集合?

是否可以在單個查詢中爲所有學生插入記錄到enrollments表中而不是每個學生?

是否Rails有任何內置的機制,或者是否需要編寫自定義邏輯來捕獲然後批量刷新到send_email的調用?

感謝您的任何信息!

回答

2

在Enrollment模型中添加after_create回調將獲得您想要的行爲。

對於has_many:through關係中的批次分配,將根據需要在註冊表中創建一個條目。對於每個新條目,Rails將在連接模型中應用所有的驗證和回調。如果學生在課程中的註冊記錄由註冊表中的條目記錄。然後,無論您如何將學生添加到課程中,這都會觸發。

這是修改招生類

class Enrollment < ActiveRecord::Base 
    belongs_to :course 
    belongs_to :student 
    after_create :send_email 

    protected 
    def send_email 
     course.send_email(student) 
    end 
end 

的代碼,只要它會調用過程中的日常SEND_EMAIL你箱使用Rails的註冊記錄。

以下將發送電子郵件。

@student.courses << @course 
@course.students << @student 
Enrollment.create :student => @student, :course => @course 
0

怎麼樣:

@last_student = Student.last 

def send_email(student) 
    put 'email sent' if student == @last_student 
end 

這也許有點凌亂使用實例變量,但應該做的工作。

相關問題