一次插入所有子记录

时间:2014-04-17 21:56:40

标签: ruby-on-rails activerecord

我有这些模特:

class Project < ActiveRecord::Base
  has_many :task_links, -> { includes(:task).order("tasks.name") }, dependent: :destroy
  has_many :tasks, through: :task_links

class TaskLink < ActiveRecord::Base
  belongs_to :project
  belongs_to :task

class Task < ActiveRecord::Base
  has_many :task_links, dependent: :destroy
  has_many :projects, through: :task_links

我想创建一个after_create回调,它将自动为所有活动项目和新创建的任务创建所有task_links。我可以通过循环活动项目并为每个项目创建一个task_link来做到这一点,但我想知道是否有更好的方法来做到这一点?最好使用一个大插入命令而不是xxx。

1 个答案:

答案 0 :(得分:0)

我不确定为什么你需要使用after_create来执行此操作,因为我认为before_create可以很好地运行。使用before_create,您可以在保存新task_links时保存所有task

class Task < ActiveRecord::Base
  has_many :task_links, dependent: :destroy
  has_many :projects, through: :task_links

  before_create :create_task_links

  def create_task_links
    # I'm assuming that the where below satisfies "all active projects"
    Project.where(active: true).find_each do |proj|
      # build only creates objects but does not save them to your database
      self.task_links.build(project: proj)
    end
  end
end