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"}

会把他们放在小学。

4

2 回答 2

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?

我想你可以明白的:)

于 2013-01-09T22:49:58.657 回答
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
于 2013-01-09T22:03:11.830 回答