Странное поведение Case в Ruby
Делаю фильтр, который выбирает данные из файла yaml. Сам yaml передается в переменную @result. @requests - это набор ответов пользователей, которые сохраняются в хеш. В консоли это выглядит примерно так:
Введите первый запрос:
item1
Введите второй запрос:
item2
Результат:
item1
item2
и другие данные из yaml по запросам.
Проблема: когда заполняю все данные, которые запрашиваются в консоли, результат выводиться. Когда ввожу только item1, а item2 пропускаю (или наоборот), результат по одному из запросов выводиться уже не хочет. Специально ввожу правильные ключевые запросы, которые совпадают в базе.
Я пробовала прописывать условия по типу "Если item1 заполнен, а item2 пустой, то выводи все результаты по item1 (и наоборот)". Но это не помогает. Возможно кто-то сможет предположить, в чем проблема?
@requests.each do |key, value|
@result = case key
when 'item1'
@result.select{ |key| key['item1'] == value }
when 'item2'
@result.select{ |key| key['item2'] == value }
else
@result
end
end
Дополнение: Пример файла yaml, который передается в @result:
- id: 1457848
manufacturer: Airbus
model: A220
year: 2003
price: 120000
date_added: 18/09/21
- id: 1457849
manufacturer: Airbus
model: A318
year: 1999
price: 190000
date_added: 15/07/21
- id: 1457849
manufacturer: Airbus
model: A318
year: 2005
price: 195000
date_added: 15/07/21
- id: 145784910
manufacturer: Boeing
model: A757
year: 2008
price: 1370000
date_added: 10/08/21
- id: 145784911
manufacturer: Comac
model: C919
year: 2019
price: 3400000
date_added: 12/01/21
- id: 145784911
manufacturer: Boeing
model: 737 MAX
year: 2015
price: 8750000
date_added: 19/08/21
Передается в @result следующим образом через initialize в файле класса Search:
def initialize requests
@result = YAML::load(File.open('airplanes.yaml'))
@requests = requests
end
Файл @requests:
class Requests
def self.requests
puts "Enter manufacturer: "
entered_manufacturer = gets.strip
puts "Enter the model: "
entered_model = gets.strip
save = { 'manufacturer' => entered_manufacturer, 'model' => entered_model }
end
end
Эти сохраненные requests передаются через новый объект класса Search в файле index-airplanes.rb:
require 'yaml'
require_relative 'requests.rb'
require_relative 'search_airplanes.rb'
requests = Requests.requests
search = Search.new requests
puts search.results
Файл класса Search (в нем лежит основной метод самого поиска:
class Search
def initialize requests
@result = YAML::load(File.open('airplanes.yaml'))
@requests = requests
end
def results
def case_result_function
@requests.each do |key, value|
@result = case key
when 'manufacturer'
@result.select{ |item| item['manufacturer'] == value }
when 'model'
@result.select{ |item| item['model'] == value }
else
@result
end
end
@result
end
case_result_function
end
end
Ответы (1 шт):
Теперь стало понятнее, что у вас тут происходит. Проблема в том, что если ничего не ввести, то под одним из ключей сохранится пустая строка, например {"manufacturer"=>"Airbus", "model"=>""}, а значит select вернёт вам пустой хэш (ведь у ваc нет таких записей, где значение было бы пустым). Значит наша задача - вернуть весь @result в таком случае. Ну и case statement тут в общем-то лишний.
@requests.each do |key, value|
next if value.blank?
@result = @result.select{ |item| item[key] == value }
end