让我们说,我有两个模型
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)
答案 0 :(得分:1)
您可以在原始Mongo驱动程序级别执行此操作:
db.users.update({}, { $push: { notifications: { message: 'Hello!' } } })
但是,如果您的目标是完成群发邮件功能,那么最好为这些通知制作一个特殊的集合,并让您的应用程序代码提取系统范围的通知和用户目标通知。
必须更新系统中的每个用户对象才能发送群发邮件,这不是一种可扩展的设计。