【问题标题】:get record with at least one associated object获取至少一个关联对象的记录
【发布时间】:2014-02-11 08:59:51
【问题描述】:

我在 mongoid 中有以下架构:

用户有很多任务 - has_many :tasks

任务属于用户 - belongs_to :user

我如何才能让至少 10 位第一批用户至少完成一项任务?

类似这样的:

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

【问题讨论】:

  • User.includes(:tasks).where("tasks.id IS NOT NULL") 应该做你需要的

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


【解决方案1】:

你可以的

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

【讨论】:

  • 谢谢,但它给了我 0,虽然我有一些用户有任务。
  • 奇怪,它对我有用.. 你能展示一下你是如何构建你的对象的吗?
  • Task.update_attributes(:user_id => user.id)user.tasks << Task.create!(...)
  • 你如何构建它们?
【解决方案2】:

您的问题是 Mongoid 的 has_many 不会在父文档中留下任何内容,因此不会对父文档进行任何对您有用的查询。但是,Task 中的belongs_to :user 会将:user_id 字段添加到tasks 集合中。这会给你留下这样可怕的事情:

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

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

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

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

【讨论】:

  • 谢谢。可能是性能问题。但我想我别无选择。
  • 缓存计数器在 MongoDB 中很常见。您可能会发现 MongoDB 中的模式与您使用的特定查询的耦合比关系系统更紧密。您可能还会发现自己更加努力地通过所有缓存和非规范化来管理您的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多