【问题标题】:Working with Constants (in Models)使用常量(在模型中)
【发布时间】:2013-01-09 20:32:07
【问题描述】:

我目前正在开发一个将成绩存储在用户表中的应用程序,如下所示(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

我正在尝试找出一个优雅的解决方案来解析存储在 users 表中的 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"}

会把它们放在小学。

【问题讨论】:

    标签: ruby-on-rails ruby constants rails-models


    【解决方案1】:

    当出现这种情况时,我更愿意重新考虑设计,而不是仅仅尝试做某种“解决方法”。正如 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?
    

    我想你可以明白的:)

    【讨论】:

    • 哇,从来没有这样想过!谢谢你的建议!!
    【解决方案2】:

    如果您想要优雅,这里有一个不错的解决方案:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2018-05-18
      • 2017-04-23
      • 2020-09-11
      • 2020-10-12
      相关资源
      最近更新 更多