2012-06-05 4 views
1

개체 배열을 last_name 개체로 정렬하고 싶지만 배열의 첫 번째 위치에 항상 특정 개체를 넣고 싶습니다. 그 것을 달성하기 위해서 나는 이미 많은 노력을 했었지만 배열의 결과 구조에 항상 실패했습니다. 여기에 내가 (이 예를 들어, @team.each do |m| puts m.username end 실패) 결과 배열 객체에있는 모든 방법을 실행할 수 없기 때문에 실패하는 나의 시도 중 하나입니다 : 당신의 도움에 대한루비 : 예외 배열 배열 정렬

if @team = UserGroup.find_by_name("team").users.sort_by(&:last_name) 
    if first_member = @team.detect{|m| m.username == "test"} 
    @team.unshift @team.reject{|m| m.username == "test"} 
    end 
end 

감사합니다.

답변

3

당신은 BTW (루비보다 더 빨리, 기능에 의해 SQL의 ORDER를 사용할 수 있습니다, 당신은 사용해야합니다 find_by_attribute!). 안된하지만,이 같은 놀이 :

물론
@team = UserGroup.find_by_name!("team").users. 
    order("username = 'test' DESC, last_name ASC") 

같은 생각 루비를 사용할 수 있습니다 질문의 제목을 응답

@team = UserGroup.find_by_name!("team").users. 
    sort_by { |u| [u.username == 'test' ? 0 : 1, u.last_name] } 
+0

나는 당신의 솔루션이 더 좋고 더 빠르다고 동의해야합니다. 고맙습니다! :) – alexschomb

1

이 시도 : 바로 당신을 이해 해요 경우

@team = UserGroup.find_by_name("team").users.sort_by(&:last_name) 
first_member = @team.select{|m| m.username == "test"} 
@team = first_member + (@team - first_member) 
+0

와우가, 감사합니다. 솔루션은 그렇게 간단 할 수 있습니다. :) 사용자 "test"가 없어도 작동합니다. – alexschomb

+0

OP가 의도 한대로 문제가 해결 되었기 때문에 괜찮습니다. 그러나'sort_by'에'm.username == 'test''를 포함 할 수 있습니다. 더 짧고 빠를 것입니다. – tokland

1

이 작동합니다 :

@team = UserGroup.find_by_name("team").users.sort_by(&:last_name) 
test=nil 
@[email protected]_if {|obj| obj.username == "test" ? (test=obj; true) : false} 
@team.insert(0, test) 
+0

답변 해 주셔서 감사합니다. 이것은 효과가 있을지 모르지만 단순성을 위해 Matzi의 솔루션을 사용하겠습니다. – alexschomb

1

는 "예외로 배열을 정렬"

를 제외하고는 여기에 13, 그래서 항상 가장 높은 순위 가져옵니다 IRB에서

(1..15).to_a.shuffle.sort { |a,b| a == 13 ? -1 : b == 13 ? 1 : a <=> b } 

출력을 : 필요한 경우

=> [13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15] 

또한 사용자 이름과 함께 작동 :

%w{mike bob mario toad test}.sort {|a,b| a == 'test' ? -1 : b == 'test' ? 1 : a <=> b } 
=> ["test", "bob", "mario", "mike", "toad"]