1

比方说,我有两个模型

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)
4

1 回答 1

1

您可能可以在原始 Mongo Driver 级别执行此操作:

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

但是,如果您的目标是完成群发消息功能,您最好为这些通知创建一个特殊集合,并让您的应用程序代码拉取系统范围的通知和以用户为目标的通知。

必须更新系统中的每个用户对象以发送大量消息不是可扩展的设计。

于 2012-12-19T15:47:31.403 回答