2011-11-22 2 views
1

하나의 배열이 하나의 ActiveRecord 테이블의 ID입니다. 그래서 그 ID와 관련된 성을 기반으로 그 배열을 정렬하고 싶습니다 ... 어떻게 할 수 있습니까? 설명 : 배열 @ students = [], 내부는 ID이고 Student.find (ID) .last 순으로 정렬하고 싶습니다. 감사합니다. 는 DorijanRuby on Rails 3 : ActiveRecord의 데이터를 기반으로 정렬 정렬

답변

5

완전히 당신이 아이디의 목록을 제공하는 경우, 질문을 이해하지 않고, 당신이 질의를하고있는 LAST_NAME으로 정렬 할 수 있습니다 물론

Student.where("id IN (?)", @students).order(:last_name) 

,이 가정 @students는 ID의 배열이고 다른 것은 없다.

귀하의 의견에 응답, 왜 해야할지 모르겠지만 @student 배열은 학생 모델과 그 속성을 모르는 ids 목록 일 뿐이며 여전히 좋아할 것입니다. 해당 배열을 주문하면 다음을 수행 할 수 있습니다.

@students = Student.where("id IN (?)", @students).order(:last_name).collect(&:id) 

이렇게하면 성으로 정렬 된 ID 배열이 반환됩니다. 그러나 다시, 나는 당신이 장면 뒤에서 무엇을하고 있는지 정말로 모르며, 당신이 무엇을 요구하고 있는지 확신 할 수 없습니다.

+0

안녕하세요 ... 빠른 답장을 보내 주셔서 감사합니다. 그러나 배열 @ students = []를 정렬해야합니다. ActiveRecords에서 데이터를 정렬하는 것이 아닙니다. 예 : 내 배열에는 숫자 [7,13,15]가 있고 성 7은 Zorro이고 13은 Anthony이고 15는 Lovejoy이므로 최종 배열은 [15,13,7]이어야합니다 ... – user899119

+0

하지만 어쩌면이 일을해야합니다. 알겠습니다. – user899119

+0

데이터베이스에서 언급 한 데이터를 조회하는 것이 허용되지 않으면 정렬하려는 데이터를 포함하도록 어레이가 필요합니다. –

0
Student.find(@students).sort_by { |s| s.last_name } 
+1

잘 작동하지만 정렬 할 학생 기록이 많은 경우 (특히 last_name 열의 색인이 생성 된 경우) 비효율적 일 수 있음을 기억하십시오. –

2

는 귀하의 의견을 바탕으로, 다음을 수행 할 : 입력

  • 반환에게 데이터베이스에 학생의 성을 기준으로 정렬 된 ID 목록을 같은 학생들의 ID 목록에서

    • 가져 가라.

    당신은 다음을 수행 할 수 있어야한다 :이 부셔

    Student.where(:id => @ids).order(:last_name).map(&:id) 
    

    :

    • where(:id => @ids) 만 ID의 배열의 ID와 학생을 선택합니다.
    • order(:last_name) 결과를 성으로 정렬합니다.
    • map(&:id)Students의 배열을 취하고 ID 열만 반환합니다. 기본적으로 괄호 안에있는 메소드 (각 학생에 대해 id을 호출하는 바로 가기)는 발견 된 각 학생에게 호출되며 반환 값은 새 배열 (ID 만 포함)로 조합됩니다.

    몇몇 개는 일 : ID가 데이터베이스에 존재하지 않는 경우

    • , 그것은 결과에서 제외됩니다 - 당신의 결과 배열이 입력 배열보다 작은 경우, 당신이 시도 할 수있다 더 이상 존재하지 않는 레코드에 액세스하십시오.
    • 학생 테이블에 많은 열이있는 경우 select(:id)을 호출하여 데이터베이스에서 Student 레코드의 모든 열을 가져 오지 않도록 할 수 있습니다.