2013-05-09 105 views
1

比方說,我有一個User與現場name,和的has_many teamsTeam是belongs_to的一個user和belongs_to的一個sport。 A Sport有一個字段name和has_many teams如何使用Mongoid對嵌套字段值進行排序?

我想通過sports行走,做一些東西,並收集由username排序teams的數組。

result = [] 
Sport.asc(:name).each do |spt| 
    # some other stuff not relevant to this question but that 
    # justifies my looping through each sport. 
    spt.teams.asc(:'user.name').each { |t| result << t } 
end 

這可是運行,並且如預期的那樣sports的排序,但球隊的result順序不排序,因爲我所期待。

什麼是正確的方法,使用Mongoid排序集合的關係值?

回答

3

我不認爲有辦法與Mongoid做到這一點。如果您正在排序的字段是嵌入的文檔的一部分,但在您使用引用文檔的情況下則不適用。

我猜你可能有兩個選擇,低效率的方式是隻梳理球隊的紅寶石收藏:

sport.teams.sort{|t1, t2| t1.user.name <=> t2.user.name}.each{ |team| result << team } 

越好,可以說是更「MongoDB的-Y」的解決方案,將被緩存的用戶名各隊的內線,用before_save回調,然後用它來球隊進行排序:

# app/models/team.rb 
class Team 
    include Mongoid::Document 

    field :user_name, :type => String 

    before_save :update_user_name 

    protected 
    def update_user_name 
    self.user_name = self.user.name if self.user 
    end 
end 

然後,你可以這樣做:

spt.teams.asc(:user_name).each { |t| result << t } 

顯然,如果用戶的名稱字段是可變的,那麼只要用戶的名稱字段被更改,您就會觸發它來保存每個子組。

class User 
    after_save :update_teams_if_name_changed 

    def update_teams_if_name_changed 
    if self.name_changed? 
     self.teams.each { |team| team.save } 
    end 
    end 
end 

由於不飛馳維護簡單,這可以說是是一個很好的候選人使用一個觀察者,而不是回調,但你的想法。

相關問題