2013-03-25 2 views
0

알고 싶습니다. 제작 스튜디오 및 출시 날짜와 같은 속성을 가진 "영화"개체 배열이 있습니다.배열을 다른 배열을 기준으로 정렬 한 다음 날짜를

먼저 제작 스튜디오의 순위와 각 영화의 날짜에 따라 객체 배열을 정렬하고 싶습니다. 예를 들어

:

studio_ratings = [Studio1, Studio2, Studio3, Studio4, Studio5] 

array_of_objects = [Object1, Object2, Object3, Object4, Object5, Object6, Object7, Object8, Object9] 

각 객체는 날짜를, 그래서 예를 들어, 그래서 Object1.date_publishedObject1.production_studio 수 있습니다.

+0

큰 모델을 제공 할 수 있습니까? 객체 란 무엇입니까? 이것은 엄격하게 루비입니까, 아니면 Rails에 내장되어 있습니까? – engineersmnky

+0

그것은 엄격하게 루비입니다. 객체는 Title, Date, Genre 등등이있는 "Movie"클래스의 인스턴스입니다. –

답변

1

나는 당신이 studio_ratings 당신이 스튜디오는 순위 받기를 원하시면 순서는 것을 의미 가정하는 경우 당신은 같은 것을 수행 할 수 있습니다.

array_of_objects.sort_by {|obj| [studio_ratings.index(obj.production_studio), obj.date_published]} 

하지만, 이러한 많은 일을하는 경우 또는를 스튜디오 목록이 길면 .index을 계속 반복하는 대신 해시를 만드는 것이 좋습니다. 예 :

>> studio_rankings = ['Universal', 'Global', 'Local', 'Wolverine'] 
=> ["Universal", "Global", "Local", "Wolverine"] 
>> class Film 
>> attr_accessor :studio, :date 
>> def initialize(studio, date) 
>>  @studio = studio 
>>  @date = date 
>> end 
>> end 
=> nil 
>> films = [Film.new('Global', '2012-01-01'), Film.new('Universal', '2013-04-12'), Film.new('Global', '2011-10-10'), Film.new('Wolverine', '2008-01-01')] 
=> [#<Film:0x101b101a0 @date="2012-01-01", @studio="Global">, #<Film:0x101b10128 @date="2013-04-12", @studio="Universal">, #<Film:0x101b100b0 @date="2011-10-10", @studio="Global">, #<Film:0x101b10038 @date="2008-01-01", @studio="Wolverine">] 
>> films.sort_by {|f| [studio_rankings.index(f.studio), f.date]} 
=> [#<Film:0x101b10128 @date="2013-04-12", @studio="Universal">, #<Film:0x101b100b0 @date="2011-10-10", @studio="Global">, #<Film:0x101b101a0 @date="2012-01-01", @studio="Global">, #<Film:0x101b10038 @date="2008-01-01", @studio="Wolverine">] 
>> studio_index = {} 
=> {} 
>> studio_rankings.each_with_index {|studio, i| studio_index[studio] = i} 
=> ["Universal", "Global", "Local", "Wolverine"] 
>> studio_index 
=> {"Local"=>2, "Wolverine"=>3, "Global"=>1, "Universal"=>0} 
>> films.sort_by {|f| [studio_index[f.studio], f.date]} 
=> [#<Film:0x101b10128 @date="2013-04-12", @studio="Universal">, #<Film:0x101b100b0 @date="2011-10-10", @studio="Global">, #<Film:0x101b101a0 @date="2012-01-01", @studio="Global">, #<Film:0x101b10038 @date="2008-01-01", @studio="Wolverine">] 
+0

정확히 내가 무엇을 찾고 있었습니까! 고맙습니다! –

관련 문제