Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 确定在保存回调后从Rails中的数组中删除了哪些ID?_Ruby On Rails_Ruby On Rails 3_Callback_After Save - Fatal编程技术网

Ruby on rails 确定在保存回调后从Rails中的数组中删除了哪些ID?

Ruby on rails 确定在保存回调后从Rails中的数组中删除了哪些ID?,ruby-on-rails,ruby-on-rails-3,callback,after-save,Ruby On Rails,Ruby On Rails 3,Callback,After Save,我试图弄清楚如何在“保存后”回调中判断数组中发生了什么变化。下面是我正在使用的代码示例: class User < ActiveRecord::Base has_many :user_maps, :dependent => :destroy has_many :subusers, :through => :user_maps, :dependent => :destroy has_many :inverse_user_maps, :class_name =&

我试图弄清楚如何在“保存后”回调中判断数组中发生了什么变化。下面是我正在使用的代码示例:

class User < ActiveRecord::Base
  has_many :user_maps, :dependent => :destroy
  has_many :subusers, :through => :user_maps, :dependent => :destroy

  has_many :inverse_user_maps, :class_name => "UserMap", :foreign_key => "subuser_id"
  has_one :parent, :through => :inverse_user_maps, :source => :user

  after_save :remove_subusers

  def remove_subusers
    if self.subuser_ids_were != self.subuser_ids
      leftover = self.subuser_ids_were - self.subuser_ids

      leftover.each do |subuser|
        subuser.destroy
      end
    end
  end
end

class UserMap < ActiveRecord::Base
  belongs_to :user
  belongs_to :subuser, :class_name => "User"
end
class用户:销毁
拥有多个:子用户,:通过=>:user\u映射,:依赖=>:destroy
有很多:反向用户映射,:类名称=>“用户映射”,:外部密钥=>“子用户id”
有_one:parent,:through=>:inverse\u user\u映射,:source=>:user
保存后:删除子用户
def删除子用户
如果self.subuser_id_是!=self.subuser\u id
剩余=self.subuser\u id\u were-self.subuser\u id
剩余。每个do |子用户|
subuser.destroy
结束
结束
结束
结束
类UserMap“用户”
结束
我正在使用after_save回调删除子用户,因为我无法使dependent destroy功能通过用户映射工作。有人有什么想法吗


谢谢

虽然严格来说这不是你问题的答案,但我认为如果你尝试以下方法,你可能会得到:dependent=>:destroy working

class User < ActiveRecord::Base
  has_many :user_maps, :dependent => :destroy
  has_many :subusers, :through => :user_maps # removing the :dependent => :destroy option
end

class UserMap < ActiveRecord::Base
  belongs_to :user
  belongs_to :subuser, :class_name => "User", :dependent => :destroy # add it here
end

从各方面考虑,这会使我紧张。我会首先尝试修改您的代码,使关联与相同的表的耦合程度降低一点,这样:dependent=>:destroy选项就可以工作了,如果做不到,请在数据库中添加一个级联删除约束,至少,无论您在rails应用程序中的何处/如何销毁关联,都将始终删除关联。

您可以按照中的建议使用脏模块访问器


在您的情况下,保存后的
处理程序将访问
子用户\u change
,这是一个由两个元素组成的数组,第一个是以前的值,第二个是新值。

谢谢您的帮助。我试过了,但id不起作用,但我想知道这是否是因为我比我展示的引用子用户的代码多一点。我无法显示所有代码,因为我有数百行代码,但我将添加与反向子用户关系相关的其他代码行。您好,我添加了更多信息,希望能对您有所帮助。没有子用户模型。这是一种自我参照关系。我试着使用subusers\u change。它说这是一个未定义的方法。我还尝试了subuser_id_change,得到了相同的消息。
class User < ActiveRecord::Base
  has_many :user_maps, :dependent => :destroy, :before_remove => :remove_associated_subuser

  def remove_associated_subuser(user_map)
    user_map.subuser.destroy
  end
end
# this will fire the callback
u = User.first
u.user_maps.destroy(u.user_maps.first)

# this WONT fire the callback
UserMap.first.destroy