2017-03-19 73 views
0

我的工作,我們鼓勵你跟蹤一個習慣期限爲30天的健身跟蹤應用程序。創建30個空記錄上創建

每個用戶的has_many項目,belong_to用戶項目,項目的has_many任務和任務belong_to項目。

什麼我希望做的是創建一個項目的時候,我想填充它會顯示在一天的順序30個空任務,並允許用戶點擊一個每天更新的任務。 (見圖) enter image description here

如果你需要參考,我很高興發佈任何代碼/視圖。 感謝您的幫助!

+1

我建議不要再創建30個記錄。在客戶端顯示元素按月份而不是記錄,而使用默認值(可以通過Task.new創建而不保存)。 –

回答

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 

,讓你在什麼地方在應用它發生更好的控制。

+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,但希望回調是一個很好的起點。

+2

可能想要做'Task.create(天:第(i + 1),項目:自營)'分配新任務向被創建的項目。 –

+0

@FrederikSpang感謝您的建議,我補充說,和一個額外的注 – alecananian

+0

好或'self.tasks << Task.create(天:第(i + 1))'..無論哪種方式將工作 –