2017-04-05 69 views
0

如何清理這一點?我想擺脫不必要的代碼,像所有的重複a.question == f.question比較我每個case語句中使用:如何避免case case內的重複條件

def notifications_lookup(filters, answers) 
    filters.flat_map do |f| 
     answers.select do |a| 
     case a.question.question_type 
     when "image" 
      a.question == f.question && a.answer_image.image_id == f.answer.to_i 
     when "single" 
      a.question == f.question && a.choice_answer.choice_id == f.answer.to_i 
     when "list" 
      a.question == f.question && a.choice_answer.choice_id == f.answer.to_i 
     when "multiple" 
      a.question == f.question && !(f.answer.split(",").map(&:to_i) & a.answer_multiple.choices.map(&:id)).empty? 
     when "rating" 
      results = verify_condition(f, a) 
      a.question == f.question && results.any? 
     else 
      a.question == f.question 
     end 
     end 
    end 
    end 

    def verify_condition(filter, a) 
    a.answer_raitings.map do |r| 
     r.raiting == filter.raiting && filter.answer.split(",").map(&:to_i).include?(r.response) 
    end 
    end 
+0

這種情況通常發生在你沒有很好地理解邏輯的時候。 –

回答

0

記住紅寶石讓你在幾個簡單的傳球做這些事情。有沒有必要做這一切一氣呵成:

def notifications_lookup(filters, answers) 
    filters.flat_map do |f| 
    answers.select do |a| 
     a.question == f.question 
    end.select do |a| 
     case a.question.question_type 
     when "image" 
     a.answer_image.image_id == f.answer.to_i 
     when "single", "list" 
     a.choice_answer.choice_id == f.answer.to_i 
     when "multiple" 
     !(f.answer.split(",").map(&:to_i) & a.answer_multiple.choices.map(&:id)).empty? 
     when "rating" 
     verify_condition(f, a).any? 
     else 
     true 
     end 
    end 
    end 
end 

另一個速戰速決是兩個條款,有相同的代碼相結合。

您可以通過在Answer模型上編寫一個==方法來更輕鬆地進行比較。

+2

「...在你的Answer模型上寫一個'=='方法,可以爲你做比較」。是。這可以使代碼的可讀性發生很大的變化。 –

0

您可以選擇對的,只是a.question == f.question,然後將結果選擇可以進一步選擇使用。

def notifications_lookup(filters, answers) 
    filters.flat_map do |f| 
     selected_answers = answers.select {|a| a.question == f.question} 
     selected_answers = selected_answers.select do |a| 
     case a.question.question_type 
     when "image" 
      a.answer_image.image_id == f.answer.to_i 
     when "single" 
      a.choice_answer.choice_id == f.answer.to_i 
     when "list" 
      a.choice_answer.choice_id == f.answer.to_i 
     when "multiple" 
      !(f.answer.split(",").map(&:to_i) & a.answer_multiple.choices.map(&:id)).empty? 
     when "rating" 
      results = verify_condition(f, a) 
      results.any? 
     else 
      true 
     end 
     end 
    end 
    end