Проверьте значение в массиве в строке - PullRequest
1 голос
/ 16 марта 2019

Я создаю базу данных ресторанов на вынос, к которой можно получить доступ Managers каждого магазина. Одна из таблиц базы данных называется Product, и в ней есть столбец с именем product_name. product_name - это строка с несколькими словами. Я пытаюсь проверить, содержит ли product_name мясо, и затем сообщить пользователю, подходит ли оно для вегетарианцев.

Это код, который у меня есть. Я пытался создать массив meats и проверить product_name против него. Я не думаю, что утверждение if not является правильным.

class Checkveg
  def self.runcheck(product_name)
    meats = ["lamb", "beef", "pork", "prawn", "chicken", "fish"]
    meats.each { |item|
      if product_name.include? item
        puts "Not suitable for vegans or vegetarians"
      end
    }
    puts "Suitable for vegans or vegetarians" if not meats.include? product_name
  end
end

** UPDATE:

Мне удалось это исправить

noVeg = false
meats = ["lamb", "beef", "pork", "prawn", "chicken", "fish"]
meats.any? { |item|
  if product_name.include? item
    noVeg = true
    break
  end
}
if noVeg == true
  puts "Not suitable for vegetarians"
else
  puts "Suitable for vegetarians"
end

Ответы [ 3 ]

2 голосов
/ 16 марта 2019

Я бы посоветовал сначала извлечь слова из названия продукта.Для этого метода я использовал регулярное выражение из хорошего примера Кэри Свовеланд .Но вы можете использовать любое регулярное выражение, которое вам больше подходит:

product_name = "Chicken_Wings 1"
product_words = product_name.scan(/[[:alpha:]](?:(?:[[:alpha:]]|\d|')*[[:alpha:]])?/x).map(&:downcase)

#=> ["chicken", "wings"]

Затем проверьте, не включен ли ни один из product_words в массив meats:

no_veg = product_words.none? { |w| meats.include? w }
#=> false

В этом случае product_name = "Carrots and onions", no_veg = true.

2 голосов
/ 16 марта 2019

Другой вариант - создать регулярное выражение, используя массив meats.

meats_regex_string = meats.map(&Regexp.method(:escape)).join('|')
meats_regex = Regexp.new(meats_regex_string)
# or /#{meats_regex_string}/
product_name.match?(meats_regex)

Вы можете не указывать .map(&Regexp.method(:escape)), если знаете, что в ваших строках нет специальных символов регулярного выражения, таких как (, *, ?, | и т. Д.

Если вас не волнует использование регистра символов:

meats_regex = Regexp.new(meats_regex_string, Regexp::IGNORECASE)
# or /#{meats_regex_string}/i
2 голосов
/ 16 марта 2019

Вы неправильно используете метод any?.Вы должны использовать это возвращаемое значение следующим образом:

#!/usr/bin/env ruby

meats = ["lamb", "beef", "pork", "prawn", "chicken", "fish"]

product_name = "Beef curry"

noVeg = meats.any? do |item|
    product_name.downcase.include? item
end

if noVeg == true
    puts "Not suitable for vegetarians"
else
    puts "Suitable for vegetarians"
end

Я также добавил downcase, так как в комментарии выше вы написали говядину с большой буквы b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...