Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用Mongoid按嵌套字段值排序?_Ruby_Sorting_Mongoid_Mongoid3_Database Relations - Fatal编程技术网

Ruby 如何使用Mongoid按嵌套字段值排序?

Ruby 如何使用Mongoid按嵌套字段值排序?,ruby,sorting,mongoid,mongoid3,database-relations,Ruby,Sorting,Mongoid,Mongoid3,Database Relations,假设我有一个用户,有一个字段名称,有许多团队,还有一个团队,属于用户,属于运动。一个Sport有一个字段name,并且有许多团队 我想浏览运动,做一些事情,收集一组团队,按用户的名称排序 result = [] Sport.asc(:name).each do |spt| # some other stuff not relevant to this question but that # justifies my looping through each sport. spt.te

假设我有一个
用户
,有一个字段
名称
,有许多
团队
,还有一个
团队
,属于
用户
,属于
运动
。一个
Sport
有一个字段
name
,并且有许多
团队

我想浏览
运动
,做一些事情,收集一组
团队
,按
用户的
名称
排序

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
result=[]
Sport.asc(:name)。每个do | spt|
#其他一些与这个问题无关的东西
#证明了我在每项运动中都能打循环。

spt.teams.asc(:'user.name')。每个{| t | result我认为Mongoid没有办法做到这一点。如果您排序的字段是嵌入文档的一部分,它可能会起作用,但在这种情况下,您使用的是引用文档

我想您可能有两种选择,效率较低的方法是用ruby对团队集合进行排序:

sport.teams.sort{|t1, t2| t1.user.name <=> t2.user.name}.each{ |team| result << team }
然后你可以做:

spt.teams.asc(:user_name).each { |t| result << t }
考虑到这并不是一个非常简单的维护方法,这可能是一个很好的选择,可以使用观察器,而不是回调,但是你明白了

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