Ruby on rails 如何获取对象的前后状态';s相关属性?
在我的申请中,我有以下关系:Ruby on rails 如何获取对象的前后状态';s相关属性?,ruby-on-rails,Ruby On Rails,在我的申请中,我有以下关系: Document has_and_belongs_to_many Users User has_and_belongs_to_many Documents 我想知道的是如何执行以下操作: 假设一个文档有3个属于它的用户。如果在更新后他们成为ex.4,我想发送一封电子邮件 将消息(文档_更新)发送到前3条,将另一封电子邮件(文档_分配)发送到第4条 因此,我必须在文档更新前后了解属于我文档的用户。 到目前为止,我的方法是创建这样一个观察者: class Docume
Document has_and_belongs_to_many Users
User has_and_belongs_to_many Documents
我想知道的是如何执行以下操作:
假设一个文档有3个属于它的用户。如果在更新后他们成为ex.4,我想发送一封电子邮件
将消息(文档_更新)发送到前3条,将另一封电子邮件(文档_分配)发送到第4条
因此,我必须在文档更新前后了解属于我文档的用户。
到目前为止,我的方法是创建这样一个观察者:
class DocumentObserver < ActiveRecord::Observer
def after_update(document)
# this works because of ActiveModel::Dirty
# @old_subject=document.subject_was #subject is a Document attribute (string)
# this is not working - I get an 'undefined method' error
@old_users=document.users_was
@new_users=document.users.all.dup
# perform calculations to find out who the new users are and send emails....
end
end
class DocumentObserver
我知道@old_用户获取有效值的机会很小,因为我猜它是由rails通过has_和_-belish_-to_-many关系动态填充的
所以我的问题是:
如何在更新发生之前获取所有相关用户
(到目前为止,我还尝试了其他一些方法:)
A.获取DocumentController::edit中的document.users.all。这将返回一个有效数组,但是我不知道如何将此数组传递给
DocumentObserver.after_更新以执行计算(当然,仅在DocumentController中设置实例变量是不起作用的)
B.尝试在DocumentObserver::中保存document.users,然后再更新。这也不行。我仍然得到新的用户值
提前谢谢
乔治
Ruby 1.9.2p320
Rails 3.1.0您可以在添加回调之前使用
class Document
has_and_belongs_to_many :users, :before_add => :do_stuff
def do_stuff(user)
end
end
当您向文档中添加用户时,将调用回调,此时,self.users
仍将包含您正在添加的用户
如果您需要更复杂的内容,在文档上使用set\u users
方法可能会更简单
def set_users(new_user_set)
existing = users
new_users = users - new_user_set
# send your emails
self.users = new_user_set
end
您可以在添加
回调之前使用
class Document
has_and_belongs_to_many :users, :before_add => :do_stuff
def do_stuff(user)
end
end
当您向文档中添加用户时,将调用回调,此时,self.users
仍将包含您正在添加的用户
如果您需要更复杂的内容,在文档上使用set\u users
方法可能会更简单
def set_users(new_user_set)
existing = users
new_users = users - new_user_set
# send your emails
self.users = new_user_set
end
谢谢然而,这种按用户粒度的方法解决了部分问题。我可以通过这种方式(在do_stuff内部)有效地发送所有“document_assigned”电子邮件,但如果同时添加两个用户(例如u4和u5),则:1。u4的文件分配电子邮件将无法通知他u5也分配了2。我仍然无法找到他们(而且只有他们)收到“文档更新”电子邮件的初始用户。(在do_stuff中发送“document_Update”将导致发送多封电子邮件,在Observer中发送也将包括新添加的用户)可能没有完全内置的方法来完成此操作-我给出了一种替代方法谢谢。然而,这种按用户粒度的方法解决了部分问题。我可以通过这种方式(在do_stuff内部)有效地发送所有“document_assigned”电子邮件,但如果同时添加两个用户(例如u4和u5),则:1。u4的文件分配电子邮件将无法通知他u5也分配了2。我仍然无法找到他们(而且只有他们)收到“文档更新”电子邮件的初始用户。(在do_stuff中发送“document_updated”将导致发送多封电子邮件,在Observer中发送也将包括新添加的用户)可能没有完全内置的方法来实现这一点-我给出了一种替代方法