Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何获取对象的前后状态';s相关属性?_Ruby On Rails - Fatal编程技术网

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中发送也将包括新添加的用户)可能没有完全内置的方法来实现这一点-我给出了一种替代方法