2011-01-06 167 views
30

我在CONTROLER執行該查詢和所​​述「組」模型的has_many用戶正在使用如何通過對象的屬性對對象數組進行排序?

@group= Group.find(params[:id]) 

@group來呈現該部分(部分轉儲組的用戶到一個表)

<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %> 

局部變量「用戶」傳遞給部分是用戶對象的陣列;

- !ruby/object:User 
    attributes: 
    updated_at: 2011-01-04 21:12:04 
    firstname: Bob 
    lastname: Smith 
    id: "15" 
    group_id: "2" 
    created_at: 2010-11-26 12:54:45 

用戶數組如何按'lastname'排序?我嘗試了幾種不同的方式,沒有任何運氣。嘗試按照數組中的對象屬性對我進行排序。另外,我沒有承諾,我可以如何做到這一點:查詢中的順序(如何:不是爲了組,而是爲了每個組的用戶)?

也許我不是指對象的名稱是否正確(「用戶」)?看起來這應該工作是它會產生一個「沒有方法」錯誤(或動力學常數分配錯誤,如果「sort_by」是沒有用的!):

users.sort_by! {|User| User.lastname} 

感謝您的幫助。

+3

sort_by!不是紅寶石1.8.x或紅寶石1.9.1;它被添加到紅寶石1.9.2。 – carols10cents 2011-02-18 21:08:45

回答

27

我發現,從here奏效的方法一致。我不明白什麼是「&」符號在做什麼 - 也許它在我的情況shorthad的「對象」,因爲「:名字」是組成數組對象的屬性。

users = users.sort_by &:lastname 

注意:我沒有承諾爲什麼,但破壞性的版本將無法正常工作。它產生一個「未定義的方法sort_by!」爲#」 errror:

users.sort_by! &:lastname 
+4

「&」是「to_proc」方法的簡稱,在符號上,to_proc基本上將它轉換爲通過任何傳入的名稱調用該方法。簡短說明:http://pragdave.pragprog.com/pragdave /2005/11/symbolto_proc.html(請注意,這很舊,它內置於1.9及以上版本,IIRC,並由舊版本的Rails添加) – Groxx 2013-11-05 20:54:13

30

http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/

@users.sort! { |a,b| a.name.downcase <=> b.name.downcase } 
+0

謝謝,我收到了「評估nil.sort時發生的錯誤!」錯誤(我將'姓名'更改爲'姓氏')。看起來這個例子沒有考慮到'lastname'是User模型的一個屬性(其中用戶是一個User對象的數組)。 – Reno 2011-01-06 02:40:28

+0

如果你的錯誤是「nil.sort!」問題是那種即@users的接收器是零。首先解決。 – 2011-01-06 07:35:45

+0

謝謝。 @users(或在我的情況'用戶')不是零。我很確定,因爲上面的例子是針對數組的對象,而不是這些數組對象中的屬性。這種方法確實有效(我相信'&'代表'object'):users = users.sort_by&:lastname – Reno 2011-01-06 13:22:41

15

這可能是因爲你有|User|User是一類。嘗試將其更改爲一個未使用的變量的名稱,如u,得到:

users.sort_by! {|u| u.lastname} 

在管道之間的術語是每個項目被存儲在變量的名稱,因爲它穿過,而不是的類型你得到的對象。這是相同的其他的Ruby塊,像do || end,或者任何其他{||}式的塊。

+0

謝謝,這雖然沒有奏效。它返回了一個「未定義的方法'sort_by!'for#「eror – Reno 2011-01-06 02:26:11

+0

對不起〜^^;我不確定我能提出什麼更多的建議,因爲我已經進入Ruby/Rails世界已經有一段時間了,很高興看到你有所作爲,儘管! – Groxx 2011-01-07 22:08:48

+0

@reno你有一個未定義的方法'sort_by!',因爲你正在嘗試對一個對象進行排序,'sort!'只能在一個對象集合上工作(例如對象數組) – adarsh 2013-06-08 16:19:18

2

你可以嘗試把訂單子句中使用「的has_many:用戶」,你有你的集團模式

+0

像一個魅力工作 - 謝謝! – Reno 2011-01-06 13:11:01

相關問題