以下面的简单对象模型为例:
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
在将所有项目添加到集合后,如何捕获SINGLE事件?
是否可以在所有学生的单个查询中将记录插入enrollments
表,而不是每个学生一个?
Rails是否有任何内置机制,或者我是否需要编写自定义逻辑来捕获对send_email
的批量刷新调用?
感谢您的任何信息!
答案 0 :(得分:2)
在注册模型中添加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
只要您使用Rails创建注册记录,它就会调用该课程的send_email例程。
以下内容将发送电子邮件。
@student.courses << @course
@course.students << @student
Enrollment.create :student => @student, :course => @course
答案 1 :(得分:0)
我检查过,看起来没有任何内置的回调会做你需要做的事情。您可能希望尝试使用自定义回调类,看看是否可以实现所需。
http://guides.rubyonrails.org/activerecord_validations_callbacks.html#callback-classes
祝你好运:)答案 2 :(得分:0)
怎么样:
@last_student = Student.last
def send_email(student)
put 'email sent' if student == @last_student
end
使用实例变量可能有点乱,但应该完成这项工作。