2016-08-03 74 views
0

我得到了一個模型day和一個模型taskday有很多tasks。我爲此使用了一個nested_form。用戶輸入一個time和兩個變量,計算結果爲index。第一個任務,最高indexstarttime =上午8點。
現在我想訂購tasksindex並將每個任務的time添加到上一個任務的starttimeRuby on Rails createmethod不起作用

我試圖解決這個問題:

def create 
    @day = current_user.days.build(day_params) 
    @day.save 

    @day.tasks.each do |task| 
    task.index = task.ur**2 + task.imp 

    end 

    if current_user.worktype = 1 
    @tasks = @day.tasks.order(index: :desc) 
    x = 0 
    @tasks.each do |task| 
     if x = 0 
     task.starttime = Time.new.beginning_of_day + 8*60*60 
     x = task.id 
     else 
     task.starttime = @day.task.find(x).starttime + @day.task.find(x).time*60 
     x = task.id 
     end 
    end 
    elsif current_user.worktype = 2 
    ... 
    end 
    @day.save 

    respond_to do |format| 
    if @day.save 
     format.html { redirect_to @day, notice: 'Day was successfully created.' } 
     format.json { render :show, status: :created, location: @day } 
    else 
     format.html { render :new } 
     format.json { render json: @day.errors, status: :unprocessable_entity } 
    end 
    end 
end 

但不知何故starttime仍然爲零,當我要打印出來的view

- @tasks.each do |task| 
    ... 
    = task.starttime.strftime("%H:%M") 

rails console檢查這一點。

consolelog爲POST:

Started POST "/days" for ::1 at 2016-08-04 02:19:03 +0200 
Processing by DaysController#create as HTML 
Parameters: {"utf8"=>"V", "authenticity_token"=>"YaLq2XBUMltzCpZxvKBp5NQGUgiw/Ockto1r0zy/dZHU3HVlp4lpcsH/b3Q9WYas97ENlwRiPzCUdOiBC06GbA==", "day"=>{"tasks_attributes"=>{"1470269934695"=> {"description"=>"1", "ur"=>"1", "imp"=>"1", "time"=>"1" 
, "_destroy"=>"false"}, "1470269939280"=>{"description"=>"2", "ur"=>"3", "imp"=>"3", "time"=>"2", "_destroy"=>"false"}}}, "commit"=>"Create Day"} 
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
(0.0ms) begin transaction 
SQL (3.5ms) INSERT INTO "days" ("user_id", "created_at", "updated_at") VALUES (?, ?, ?) [["user_id", 1], ["created_at", "2016-08-04 00:19:03.986762"], ["updated_at", "2016-08-04 00:19:03.986762"]] 
SQL (0.0ms) INSERT INTO "tasks" ("description", "ur", "imp", "time", "day_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) [["description", "1"], ["ur", 1], ["imp", 1], ["time", 1], ["day_id", 11], ["created_at", "2016-08-04 00:19:03.992775"], ["updated_at", "2016-08-04 00:19:03.992775"]] 
SQL (0.0ms) INSERT INTO "tasks" ("description", "ur", "imp", "time", "day_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) [["description", "2"], ["ur", 3], ["imp", 3], ["time", 2], ["day_id", 11], ["created_at", "2016-08-04 00:19:03.994776"], ["updated_at", "2016-08-04 00:19:03.994776"]] 
(4.0ms) commit transaction 
Task Load (0.5ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."day_id" = ? [["day_id", 11]] 
Task Load (0.5ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."day_id" = ? ORDER BY "tasks"."index" DESC [["day_id", 11]] 
(0.0ms) begin transaction 
SQL (1.0ms) UPDATE "tasks" SET "index" = ?, "updated_at" = ? WHERE "tasks"."id" = ? [["index", 2], ["updated_at", "2016-08-04 00:19:04.006796"], ["id", 24]] 
SQL (1.0ms) UPDATE "tasks" SET "index" = ?, "updated_at" = ? WHERE "tasks"."id" = ? [["index", 12], ["updated_at", "2016-08-04 00:19:04.009792"], ["id", 25]] 
(3.6ms) commit transaction 
(0.0ms) begin transaction 
(0.0ms) commit transaction 
Redirected to http://localhost:3000/days/11 
Completed 302 Found in 39ms (ActiveRecord: 14.6ms) 

編輯

大廈@ evanbike的答案我添加了一個task.save每次starttime設置。但沒有任何改變,所以我試圖刪除If語句,現在保存starttime,但每個task都有相同的時間。

@tasks = @day.tasks.order(index: :desc) 
x = 0 
@tasks.each do |task| 
    if x = 0 
    task.starttime = Time.new.beginning_of_day + 8*60*60 
    task.save 
    x = task.id 
    else 
    task.starttime = @day.task.find(x).starttime + @day.task.find(x).time*60 
    task.save 
    x = task.id 
    end 
end 
@day.save 

我希望有人能幫我解決這個問題。
在此先感謝。

+0

你如何測試'starttime'來查看它是否爲零? – MarsAtomic

+0

@MarsAtomic更新後可能發佈 – Max

+0

在你的控制檯日誌中,當這個'create'運行時,你能否看到一天對象正在被保存以及嵌套任務?另外,你是否嘗試過使用'save!'來顯式拋出錯誤,以防萬一出現錯誤時保存? – MarsAtomic

回答

0

當你這樣做,你要設置的task實例的index@day協會緩存:

@day.tasks.each do |task| 
    task.index = task.ur**2 + task.imp 
end 

然後,當你這樣做:

@tasks = @day.tasks.order(index: :desc) 

...它會打一個數據庫調用(因爲你打電話給order)並返回新的實例 - 沒有設置index。如果你叫sort或一些陣列的方法,它會使用存儲的實例

我認爲最簡單的save任務的情況下,您設置的每個值後。打電話sort關聯會大概工作,但似乎很脆弱。

+0

請看看我的編輯 – Max

+0

我剛剛意識到,它必須是'如果x == 0'。 ..現在一切正常,謝謝。 – Max

相關問題