任務進度 進度要紀錄多個子任務 但數量不一 進度之型態 也可能不是整數或浮點數 如果進度要紀錄多個子任務,但子任務的數量可能不一,且進度的型態也可能不是整數或浮點數,您可以考慮使用以下資料表設計: 確定資料表的名稱:例如,您可以將這個資料表命名為 "member_mission_progress"。 確定欄位名稱和資料類型:這個資料表至少需要包含下列欄位: id:唯一識別符,使用自動遞增整數。 member_id:會員識別符,使用整數或者字串型態。 mission_id:任務識別符,使用整數或者字串型態。 progress:任務進度,使用文字型態。您可以將進度資料以 JSON 格式存儲在 progress 欄位中,並在需要時進行解析。例如: json 確定主鍵和索引:您可以將 id 欄位設置為主鍵,以便更容易識別和查詢特定的進度記錄。此外,您可以考慮為 member_id 和 mission_id 欄位設置索引,以便更快速地查詢具有特定會員和任務的進度記錄。 設計關聯性:如果您的系統中有會員和任務的概念,您可以考慮在這個資料表中建立關聯性。具體而言,您可以在 member_id 和 mission_id 欄位上添加外鍵約束,以確保進度記錄只與現有的會員和任務相關聯。 總體而言,這個資料表設計允許您存儲具有可變數量子任務和任意進度型態的任務進度記錄。當需要讀取或修改進度記錄時,您可以使用 JSON 函數或程式庫來解析和操作進度資料。但請注意,在使用 JSON 格式存儲資料時,需要仔細考慮資料的完整性、正確性和安全性,以避免資料損壞或安全漏洞。 ``` create_table :progress do |t| t.references :user, null: false t.string :key_of_task, null: false t.text :progress_detail #with json t.decimal :percent, precision: 4, scale: 1, default: 0 #0.0-100.0 t.datetime :start_date t.datetime :expiration_date t.boolean :enable_accumulation ,default: false#可累積 t.boolean :enable_display ,default: false#可顯示 t.boolean :is_enable ,default: false#已啟動 t.boolean :is_send_out ,default: false#已送出 t.timestamps end ``` progress_detail 例子: 行為:在任一遊戲中投注或連續投注2天。 結果:根據投注金額領取獎勵:所有遊戲下注金額:投注金額超過1000可領取獎勵50獵人幣。 每日連續下注:連續2天,每天投注達100,可領取10獵人幣。 ``` { "details":[ { "key":"20230301", "target":100, "progress":100 }, { "key":"20230302", "target":100, "progress":0 } ] } ``` 記存任務進度 以達成值/目標值,去計算完成率 如有多個子項目 完成率為 子項目完成率總加/子項目數 new progress(user,key_of_task) progress.create(progress_detail = null,expiration_date=null,start_date=null); //start_date def: today progress.add_submissions(key,target,progress); progress.update_submissions(key,progress,target); progress.percent()