我正在开设一个健身追踪应用,我们鼓励您追踪30天的习惯。
每个用户都有很多项目,项目属于用户,项目有很多任务,任务属于项目。
我要做的是创建项目时,我想填充30个空白任务,这些任务将按照一天的顺序显示,并允许用户点击一天并更新任务。 (见图) enter image description here
如果您需要参考,我很乐意发布任何代码/视图。 谢谢你的帮助!
答案 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
这使您可以更好地控制应用程序的确切位置。