0

私は現在、次のようにユーザーテーブルに成績を保存するアプリに取り組んでいます(jsonエンコード):

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

Users モデルには、各学年の範囲に加えて、それらすべてを結合するための定数が設定されています。

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

それらを小学校に入れます。

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 に答える