获取至少一个关联对象的记录

时间:2014-01-21 16:25:34

标签: ruby-on-rails mongodb mongoid model-associations

我在 mongoid 中有以下架构:

  

用户有许多任务 - has_many:tasks

     

任务属于用户 - belongs_to:user

如何只有10名第一批至少有一项任务的用户?

这样的事情:

User.where(:tasks.ne => [] ).limit(10)

2 个答案:

答案 0 :(得分:2)

你的问题是,Mongoid的has_many不会在父文档中留下任何内容,因此父文档上没有任何查询可以对你做任何有用的事情。但是,belongs_to :user中的Task会在:user_id集合中添加tasks字段。这让你有可怕的事情:

user_ids = Task.all.distinct(:user_id)
users    = User.where(:id => user_ids).limit(10)

当然,如果您有embeds_many :tasks而不是has_many :tasks,那么您可以根据需要查询:tasks集合中的users。 OTOH,这可能会打破其他事情。

如果您需要将任务分开(即未嵌入),那么您可以在User中设置一个计数器以跟踪任务数量,然后您可以这样说:

User.where(:num_tasks.gt => 0).limit(10)

答案 1 :(得分:0)

你可以做到

User.where(:tasks.exists => true).limit(10)

更新

在做的时候为我工作:

u = User.new
t = u.tasks.build
t.save
u.save

u = User.new
u.save

User.where(:tasks.exists => true).limit(10).count
=> 1