You need to add the method M, in order to filter the list of films for a pair of key-value.

puts films.m(genre: 'Comedy') class Movie attr_reader :url, :title, :year, :country, :date, :genre, :length, :rating, :director, :actors def initialize(row) @url = row[0] @title = row[1] @year = row[2] @country = row[3] @date = row[4] @genre = row[5].to_s @length = row[6].to_i @rating = row[7] @director = row[8] @actors = row[9] end def has_genre?(field) @genre.include?(field) end def to_s "#{@title} (#{@year}), #{@genre} - #{@director}; #{@actors}" end end ____movielist.rb require 'csv' require 'date' require 'ostruct' require_relative 'movie.rb' KEYS = [:url, :title, :year, :country, :date, :genre, :length, :rating, :director, :actors] class MoviesCollection def initialize(filename) @filename = filename @movies = CSV.read(filename, col_sep: '|', write_headers: :true, headers: KEYS). map{|film| Movie.new(film)} end def all puts @movies.first(5) #all films end def sort_by (field) # sort by any field @movies. sort_by {|movie| movie.send(field)} end def m(filters) filters.each do |key, val| @movies.select {??? def except_genre (genre) #delete genre @movies. select{|movie| !movie.has_genre?(genre)}. map{|movie| movie.title + " " + movie.genre.to_s} end def stats(field) if field == "date" @movies.map { |movie| (Date.parse(movie.date, '%Y-%m-%d').mon if movie.date.length == 10) }.compact. group_by{|i| i}.collect{|month, group| [month, group.count]}.to_h.sort. map{ |month, quant| Date::MONTHNAMES[month] + ' - ' + quant.to_s } else @movies.map{|movie| movie.send(field)}. sort_by{|field| field}.group_by{|field| field}. map{|field, group| [field, group.count]} end end end __mov.rb require_relative 'movielist.rb' require_relative 'movie.rb' filename = "movies.txt" films = MoviesCollection.new(filename) puts puts films.all # весь массив puts puts films.sort_by("title").first(5) # сортировка по заданному полю puts puts films.m(genre: 'Comedy') # фильмы определенного жанра + сортировка по стране puts puts films.except_genre("Sci-Fi").first(5) #фильмы за исключением определенного жанра, отсортированные по дате puts puts films.stats("date").first(5) # кол-во фильмов по запрашеваемому полю 
  • What is the key and what is the value? Sorting is usually done either by key or by value, can you tell exactly how we sort here? - cheops
  • @cheops We sort by a key-value pair of puts films.m (genre: 'Comedy'), for example, and so respectively for any field - Arthur
  • If you are given an exhaustive answer, mark it as correct (a daw opposite the selected answer). - Nicolas Chabanovsky

1 answer 1

You can do the following:

 def m(filters) res = [] filters.each do |key, val| res += @movies.select { |x| x.send(key) == val } end res end 
  • Thank you very much! The method works - Arthur
  • and if it is necessary to make it possible to use several key-value combinations for filtering? puts films.m (genre: 'Comedy', year: '1993') - Arthur
  • reduce , homemade reduce :) - D-side
  • @movies does not select from @movies , but the result of the previous step, and not add to the result, but rewrite it. - D-side