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