2011-11-22 70 views

回答

5

沒有完全理解這個問題,如果你指定id的列表,你可以當你做查詢姓氏排序:

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

。當然,這是假設@students是一個ID數組,沒有別的。

迴應你的評論,我不確定你爲什麼需要這樣做,但是如果你的@student數組只是一個不知道Student模型及其屬性的ID列表,而且你仍然想排列數組,你可以這樣做:

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

這將返回一個按姓氏排序的ID數組。但是,我不知道你在幕後做了什麼,我不確定你在問什麼。

+0

嗨...感謝您的快速回復,但我需要對array @ students = []進行排序,而不是從ActiveRecords訂購數據。例如:在我的陣列中有數字[7,13,15],並且姓氏7是Zorro,13是安東尼,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不存在於數據庫中,它會被排除的結果 - 如果你的結果陣列比你的輸入數組小,你可能試圖訪問不再存在的記錄。
  • 如果Students表的列數很多,則可能需要考慮調用select(:id),以便不從數據庫中提取學生記錄的每一列。
相關問題