2013-05-09 109 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 

由于不飞驰维护简单,这可以说是是一个很好的候选人使用一个观察者,而不是回调,但你的想法。

相关问题