область подсчета нескольких имен строк?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я пытаюсь сделать <%= @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 amp; 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
  

Ответ №1:

Передать массив имен в область:

 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')
  

Комментарии:

1. Ах, отлично! Я был так близок, лол. Я поставлю галочку, когда мне будет разрешено, но в то же время вы думаете, что я делаю это наиболее эффективным способом или есть лучший способ idk best practices для условных обозначений строк?

2. @AnthonyGalli.com да, вы были почти на месте! Что касается объема — действительно, это правильный, эффективный и общепринятый способ. Что касается habit_badge метода — он определенно не относится к модели. Его следует переместить в какой-нибудь помощник или презентер, но точно не в модель.