我想从数据库中的电影中获取评分并返回一组独特的评分,按以下顺序排序:
G PG PG-13 R NC-17
一个平原Array#sort
是不够的:
["PG-13", "PG", "NC-17", "G", "R"].sort
# => ["G", "NC-17", "PG", "PG-13", "R"]
下面的代码给了我想要的东西,但似乎有更好的方法来编写它,而不必使用delete
and <<
。任何想法,将不胜感激。
class Movie < ActiveRecord::Base
def self.all_ratings
allRatings = []
Movie.all.each do |movie|
unless allRatings.include?(movie.rating)
allRatings << movie.rating
end
end
if allRatings.include?("NC-17")
allRatings.sort!
allRatings.delete("NC-17")
allRatings << "NC-17"
return allRatings
else
return allRatings.sort
end
end
end
更新:使用 Sergio 的提示,我能够重构代码。如果有人有其他想法,我会很感激反馈。
class Movie < ActiveRecord::Base
def self.all_ratings
allRatings = []
Movie.all.each do |movie|
unless allRatings.include?(movie.rating)
allRatings << movie.rating
end
end
allRatings.sort_by! {|t| t == 'NC-17' ? 'ZZZ' : t}
end
end
更新:使用 ByScripts 提示,此代码运行良好且非常简洁。我必须从 Rails 3.1.0 升级到 Rails 3.2.8 才能获得该pluck
方法。看起来它是在 3.2.1 中引入的。
我还必须添加.sort
以获得所需的输出。
class Movie < ActiveRecord::Base
def self.all_ratings
all_ratings = Movie.pluck(:rating).uniq.sort# don't retrieve unnecessary datas
all_ratings << all_ratings.delete('NC-17') # directly inject NC-17 at the end if exists
all_ratings.compact # remove nil values
end
end