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