Ruby on rails 如何对数组中的项进行排序,以匹配它在另一个数组中的显示顺序
我想从数据库中的电影中获取收视率,并返回一组独特的收视率,按以下顺序排序:Ruby on rails 如何对数组中的项进行排序,以匹配它在另一个数组中的显示顺序,ruby-on-rails,ruby,arrays,refactoring,Ruby On Rails,Ruby,Arrays,Refactoring,我想从数据库中的电影中获取收视率,并返回一组独特的收视率,按以下顺序排序: G PG PG-13 R NC-17 简单的数组#排序是不够的: ["PG-13", "PG", "NC-17", "G", "R"].sort # => ["G", "NC-17", "PG", "PG-13", "R"] 下面的代码给出了我想要的,但似乎有一种更好的编写方法,不必使用delete和您可以使用这个小技巧 sorted = ["PG-13", "PG", "NC-17", "G", "R"].s
G PG PG-13 R NC-17
简单的数组#排序
是不够的:
["PG-13", "PG", "NC-17", "G", "R"].sort
# => ["G", "NC-17", "PG", "PG-13", "R"]
下面的代码给出了我想要的,但似乎有一种更好的编写方法,不必使用
delete
和您可以使用这个小技巧
sorted = ["PG-13", "PG", "NC-17", "G", "R"].sort_by {|t| t == 'NC-17' ? 'ZZZ' : t }
sorted # => ["G", "PG", "PG-13", "R", "NC-17"]
基本上,为了排序的目的,您可以用“ZZZ”代替“NC-17”,后者最后排序。您可以使用这个小技巧
sorted = ["PG-13", "PG", "NC-17", "G", "R"].sort_by {|t| t == 'NC-17' ? 'ZZZ' : t }
sorted # => ["G", "PG", "PG-13", "R", "NC-17"]
基本上,出于排序的目的,您可以将“NC-17”替换为最后排序的“ZZZ”。我喜欢塞尔吉奥的技巧,但如果您正在寻找原始代码的更简单版本,其中仍然有删除和我喜欢塞尔吉奥的技巧,但是,如果您正在寻找一个更简单的原始代码版本,它仍然有删除
和,应该可以工作:
def self.all_ratings
all_ratings = Movies.order(:rating).pluck(:rating).uniq # don't retrieve unnecessary datas
all_ratings << all_rating.delete('NC-17') # directly inject NC-17 at the end if exists
all_ratings.compact # remove nil values
end
def self.all_评级
所有分级=电影。顺序(:分级)。弹拨(:分级)。uniq#不要检索不必要的数据
所有有效的评分:
def self.all_ratings
all_ratings = Movies.order(:rating).pluck(:rating).uniq # don't retrieve unnecessary datas
all_ratings << all_rating.delete('NC-17') # directly inject NC-17 at the end if exists
all_ratings.compact # remove nil values
end
def self.all_评级
所有分级=电影。顺序(:分级)。弹拨(:分级)。uniq#不要检索不必要的数据
所有分级class电影
类电影
谢谢塞尔吉奥,正是我在寻找汉克斯·塞尔吉奥的那种方法,正是我在寻找的那种方法非常酷。我使用的代码是Rails 3.1.0,它没有pull
方法。升级到Rails 3.2.8,效果非常好。我唯一需要做的更改是在第一行,我必须在.uniq
之后添加一个.sort
,否则输出是[“G”,“R”,“PG-13”,“PG”,“NC-17”]
,uniq评级的顺序(以DB为单位)。谢谢的确更新后添加了.order()(将其放在电影之后,以便DB执行命令)非常酷。我使用的代码是Rails 3.1.0,它没有pull
方法。升级到Rails 3.2.8,效果非常好。我唯一需要做的更改是在第一行,我必须在.uniq
之后添加一个.sort
,否则输出是[“G”,“R”,“PG-13”,“PG”,“NC-17”]
,uniq评级的顺序(以DB为单位)。谢谢的确已更新以添加.order()(将其放置在电影之后,以便DB执行命令)您忘记放置一个!压缩后:),最好使用Movie.uniq.pluck(:rating)
而不是Movie.pluck(:rating).uniq
。第二个返回一个数组列表,其大小与调用uniq之前db上的电影数相同。您忘记放置一个数组!压缩后:),最好使用Movie.uniq.pluck(:rating)
而不是Movie.pluck(:rating).uniq
。第二个函数返回一个数组列表,其大小与调用uniq之前db上的电影数相同。
def sort(ratings)
ratings.sort!
return ratings unless ratings.include?("NC-17")
ratings.delete("NC-17")
ratings << "NC-17"
end
def self.all_ratings
all_ratings = Movies.order(:rating).pluck(:rating).uniq # don't retrieve unnecessary datas
all_ratings << all_rating.delete('NC-17') # directly inject NC-17 at the end if exists
all_ratings.compact # remove nil values
end
class Movie < ActiveRecord::Base
RatingOrder = %w[G PG PG-13 R NC-17]
def self.all_ratings
RatingOrder & Movie.all.map(&:rating)
end
end