ActiveRecord:可以在单个批处理操作中将对象添加到has_many:through中吗?

时间:2009-08-21 20:51:21

标签: ruby-on-rails activerecord

以下面的简单对象模型为例:

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的批量刷新调用?

感谢您的任何信息!

3 个答案:

答案 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

使用实例变量可能有点乱,但应该完成这项工作。