2013-05-09 3 views
1

의 내가 필드 name, 어느 has_many teamsUseruser을 belongs_to Teamsport belongs_to 있다고 가정 해 봅시다. 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

나는 이것을 몽고 이드에게하는 방법이 없다고 생각합니다. 정렬 기준으로 사용한 필드가 임베디드 문서의 일부 였지만이 경우 참조 된 문서를 사용하는 경우에는 작동하지 않을 수 있습니다. 것, 틀림없이 더

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

더 나은, 그리고 'MongoDB를-Y'솔루션 : 당신이 아마 여기에 두 가지 옵션이 있습니다 생각

은 덜 효율적인 방법은 루비에서 팀의 컬렉션을 정렬하는 것 그럼 그냥 할 수

# 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 

:하십시오 before_save 콜백을 사용하여, 각 팀 내부의 사용자 이름을 캐시하고 팀을 정렬 할 것을 사용할 수

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 

이 틀림없이 오히려 콜백보다는 관찰자를 사용하는 좋은 후보가 될 수 있지만, 당신은 아이디어를 얻을.