在创建时创建30个空记录

时间:2017-03-19 17:15:24

标签: ruby-on-rails

我正在开设一个健身追踪应用,我们鼓励您追踪30天的习惯。

每个用户都有很多项目,项目属于用户,项目有很多任务,任务属于项目。

我要做的是创建项目时,我想填充30个空白任务,这些任务将按照一天的顺序显示,并允许用户点击一天并更新任务。 (见图) enter image description here

如果您需要参考,我很乐意发布任何代码/视图。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用Active Record's after_create callback,它允许您在为特定模型创建新记录时执行任务:

class Project < ActiveRecord::Base
    has_many :tasks

    after_create :create_empty_tasks

    private
        def create_empty_tasks
            # Create your 30 Task objects
            30.times do |i|
                Task.create(day: (i + 1), project: self) # Update to match your schema
            end
        end
end

您当然需要更新该代码以将任何特定于用户的数据传递到Task,但希望回调是一个很好的起点。

答案 1 :(得分:1)

class Project < ActiveRecord::Base
  has_many :tasks

  def create_tasks!(n = 30)
    self.class.transaction do
      1..n.each do |day|
        self.tasks.create(day: day)
      end 
    end
  end
end

在单个事务中包装a mass insert对性能至关重要 - 否则每个插入都将在自己的事务中运行。

您可以使用after_create模型回调来调用create_tasks! - 但这可能会有问题,因为每次创建可能使测试变慢的项目时都会触发回调。

class Project < ActiveRecord::Base
  has_many :tasks
  after_create :create_tasks!

  def create_tasks!(n = 30)
    self.class.transaction do
      1..n.each do |day|
        self.tasks.create(day: day)
      end 
    end
  end
end

另一种方法是在你的控制器中调用它:

class ProjectsController < ApplicationController
  def create
    @project = Project.new(project_params)
    if @project.save
      @project.create_tasks!
      redirect_to @project
    else
      render :new
    end
  end 
end

这使您可以更好地控制应用程序的确切位置。