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