2016-10-10 5 views
1

私は<%= @user.challenges.habit_badge.count %>をやろうとしていますが、nameの文字列を含めるように範囲を設定する方法がわかりません。habit_badgeに含めたいです。スコープは複数の文字列名をカウントしますか?

scope :habit_badge, -> do 
    where(name: ('Read 20 Min', 'Run a Mile', 'Meditate 10 Min', etc....)) 
    end 

    def habit_badge 
    if name == "Read 20 Min" 
     ActionController::Base.helpers.image_tag("read.png", class: "gold-star") 
    elsif name == "Exercise 20 Min" 
     ActionController::Base.helpers.image_tag("exercise.png", class: "gold-star") 
    elsif name == "Meditate 10 Min" 
     ActionController::Base.helpers.image_tag("meditate.png", class: "gold-star") 
    elsif name == "Stretch 5 Min" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Write 500 Words" 
     ActionController::Base.helpers.image_tag("write.png", class: "gold-star") 
    elsif name == "Walk 5,000 Steps" 
     ActionController::Base.helpers.image_tag("walk.png", class: "gold-star") 
    elsif name == "Eat Fruit & Veg" 
     ActionController::Base.helpers.image_tag("fruit-and-vegetable.png", class: "gold-star") 
    elsif name == "Plan Day" 
     ActionController::Base.helpers.image_tag("plan.png", class: "gold-star") 
    elsif name == "After Waking, Guzzle Water" 
     ActionController::Base.helpers.image_tag("water.png", class: "gold-star") 
    elsif name == "Track Consumption" 
     ActionController::Base.helpers.image_tag("track-food.png", class: "gold-star") 
    elsif name == "Random Act of Kindness" 
     ActionController::Base.helpers.image_tag("random-kindness.png", class: "gold-star") 
    elsif name == "Write 3 Gratitudes" 
     ActionController::Base.helpers.image_tag("gratitude.png", class: "gold-star") 
    elsif name == "Juice Fast" 
     ActionController::Base.helpers.image_tag("juice.png", class: "gold-star") 
    elsif name == "Not Smoke" 
     ActionController::Base.helpers.image_tag("not-smoke.png", class: "gold-star") 
    elsif name == "Not Drink Alcohol" 
     ActionController::Base.helpers.image_tag("not-drink.png", class: "gold-star") 
    else 
     ActionController::Base.helpers.image_tag("gold-star-maze.png", class: "gold-star") 
    end 
    end 

答えて

2

スコープに名前の配列を渡します。

scope :habit_badge, -> { 
    where(name: ['Read 20 Min', 'Run a Mile', 'Meditate 10 Min']) 
} 

それのように扱われます:

SELECT "resources".* FROM "resources" WHERE "resources"."name" IN ('Read 20 Min', 'Run a Mile', 'Meditate 10 Min') 
+0

完璧なああ!私はとても笑っていた。私は許可されているときにチェックマークをつけますが、その間に私はこれを最も効率的なやり方だと思っていますか?または文字列条件のためのより良い方法がありますか? –

+1

@ AnthonyGalli.comうん、あなたはほとんどそこにいた!スコープに関しては、確かに、それは正しい、効率的な従来の方法です。 'habit_badge'メソッドに関しては**間違いなく**モデルに属していません。それはいくつかのヘルパーやプレゼンターに移動する必要がありますが、確かにモデルではありません。 –

関連する問題