2009-08-21 51 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 

这也许有点凌乱使用实例变量,但应该做的工作。

相关问题