データベース内の映画から評価を取得し、次の順序で並べ替えられた一意の評価の配列を返したいと考えています。
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