Mongoid将嵌入文档插入到许多文档中

时间:2012-12-19 15:30:13

标签: ruby-on-rails mongoid

让我们说,我有两个模型

class User
  embeds_many :notifications
  field :age, type :Integer

class Notification
  embedded_in :user
  field :message, type: String

我想创建通知并将其添加到符合特定条件的所有用户。我想出的就是:

notification = Notification.new
notification.message = "Hello"
User.where(:age.ge => 18).push(:notifications, notification)

但这不起作用。有什么想法吗?

UPD:我知道,有一种方法可以让它像这样工作:

users = User.where(:age.ge => 18)
users.each do |user|
  notification = Notification.new
  notification.message = "Hello"
  user.notifications << notification
  user.save
end

但这似乎是丑陋而低效的代码。

UPD2:最后,这个代码可以直接与驱动程序一起工作,如Winfield所述:

users = User.where(:age.ge => 18)
notification = Notification.new
notification.message = "Hello"
User.collection.update(users.selector, {'$push' => {notifications: notification.as_document}}, multi: true)

1 个答案:

答案 0 :(得分:1)

您可以在原始Mongo驱动程序级别执行此操作:

db.users.update({}, { $push: { notifications: { message: 'Hello!' } } })

但是,如果您的目标是完成群发邮件功能,那么最好为这些通知制作一个特殊的集合,并让您的应用程序代码提取系统范围的通知和用户目标通知。

必须更新系统中的每个用户对象才能发送群发邮件,这不是一种可扩展的设计。