我的工作,我們鼓勵你跟蹤一個習慣期限爲30天的健身跟蹤應用程序。創建30個空記錄上創建
每個用戶的has_many項目,belong_to用戶項目,項目的has_many任務和任務belong_to項目。
什麼我希望做的是創建一個項目的時候,我想填充它會顯示在一天的順序30個空任務,並允許用戶點擊一個每天更新的任務。 (見圖) enter image description here
如果你需要參考,我很高興發佈任何代碼/視圖。 感謝您的幫助!
我的工作,我們鼓勵你跟蹤一個習慣期限爲30天的健身跟蹤應用程序。創建30個空記錄上創建
每個用戶的has_many項目,belong_to用戶項目,項目的has_many任務和任務belong_to項目。
什麼我希望做的是創建一個項目的時候,我想填充它會顯示在一天的順序30個空任務,並允許用戶點擊一個每天更新的任務。 (見圖) enter image description here
如果你需要參考,我很高興發佈任何代碼/視圖。 感謝您的幫助!
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
,讓你在什麼地方在應用它發生更好的控制。
這是偉大的!正是我需要的! –
您可以使用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
,但希望回調是一個很好的起點。
可能想要做'Task.create(天:第(i + 1),項目:自營)'分配新任務向被創建的項目。 –
@FrederikSpang感謝您的建議,我補充說,和一個額外的注 – alecananian
好或'self.tasks << Task.create(天:第(i + 1))'..無論哪種方式將工作 –
我建議不要再創建30個記錄。在客戶端顯示元素按月份而不是記錄,而使用默認值(可以通過Task.new創建而不保存)。 –