2013-01-09 23 views
0

我目前的工作對存儲在用戶表中的成績,像這樣(JSON編碼)的應用程序工作:與常量(以型號)

{"6":"6th Grade","7":"7th Grade","8":"8th Grade"} 

有常數設置在每個年級跨度用戶模式加上一個他們都結合起來:

ELEMENTARY = %w(Kindergarten 1st\ Grade 2nd\ Grade 3rd\ Grade 4th\ Grade 5th\ Grade) 
MIDDLE_SCHOOL = %w(6th\ Grade 7th\ Grade 8th\ Grade) 
HIGH_SCHOOL = %w(9th\ Grade 10th\ Grade 11th\ Grade 12th\ Grade) 
GRADES = ELEMENTARY + MIDDLE_SCHOOL + HIGH_SCHOOL 

我試圖找出一個完美的解決方案上分析存儲在用戶表中的JSON數據吐出其跨距級用戶所屬了。所以,如果用戶有以下幾點:

{"0":"Kindergarten","1":"1st Grade","2":"2nd Grade","3":"3rd Grade","4":"4th Grade","5":"5th Grade", "6":"6th Grade", "9":"9th Grade"} 

那麼用戶處於「一般」等級跨度。

如果用戶在任何常數中選擇了任何等級,那麼他們在該常量等級範圍內。例如:

{"0":"Kindergarten"} 

會把它們放在小學。

回答

2

時的那種情況出現,而不是隻是做一種「變通」,我更喜歡重新考慮設計。那種邏輯,正如cmpolis所示的解決方案所示,並不那麼簡單。那麼,爲什麼不創建一個新的類來處理呢?這樣可以使維護變得更容易,而且更容易閱讀(並測試 - 如果您編寫測試)。

考慮到這一點我只是重構發表cmpolis的解決方案,我想出了這樣的:

class CheckGradeSpan 
    def initialize(grades) 
    @grades = JSON.parse(grades) 
    end 

    def is_elementary? 
    (@grades.keys & ["0", "1", "2", "3", "4", "5"]).length > 0 
    end 

    def is_middle_school? 
    (@grades.keys & ["6", "7", "8"]).length > 0 
    end 

    def is_high_school? 
    (@grades.keys & ["9", "10", "11", "12"]).length > 0 
    end 
end 

你有一個很好的API來檢查用戶的等級跨度這樣:

grade_check = CheckGradeSpan.new('{"0":"Kindergarten","1":"1st Grade","2":"2nd Grade","3":"3rd Grade"}') 
grade_check.is_elementary? 

我認爲你可以得到的想法:)

+0

哇,從來沒有想過會這樣!感謝您的建議! – dennismonsewicz

1

如果你打算爲優雅,這裏是一個體面的解決方案:

data = JSON.parse({"0":"Kindergarten","1":"1st Grade","2":"2nd Grade","3":"3rd Grade"}) 
gradeSpans = [] 
gradeSpans << 'Elementary' if (data.keys & ["0", "1", "2", "3", "4", "5"]).length > 0 
gradeSpans << 'Middle' if (data.keys & ["6", "7", "8"]).length > 0 
gradeSpans << 'High' if (data.keys & ["9", "10", "11", "12"]).length > 0 
gradeSpans = 'General' if gradeSpans.length == 3