ruby accepts_nested_attributes_for和after_remove

balp4ylt  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(90)

我有一个这样的模型

class Post < ApplicationRecord

  has_many :comments,
            after_add: :soil,
            after_remove: :soil,
            dependent: :destroy

  attr_accessor :soiled_associations

  accepts_nested_attributes_for :comments, allow_destroy: true

  def soil(record)
    self.soiled_associations = [record]
  end
end

当我在视图中添加一个新的comment时,它将对象添加到我的post.soiled_associations属性中(顺便说一句,soiled_associations是我试图命名一个自定义方法,它做的事情类似于Rails的Dirty类,但用于关联)。
但是,当我在视图中删除注解时,post.soiled_associations属性中没有添加任何内容。
我做错了什么?我怀疑这是关于accepts_nested_attributes_for是如何工作的(也许绕过这些回调),但有人能解释一下吗?

xzv2uavs

xzv2uavs1#

不能告诉你你做错了什么,因为你还没有表现出你在做什么。但只有几种方法可以做到这一点:

>> Post.new(comments_attributes: [{}]).soiled_associations
=> [#<Comment:0x00007f01e99a30c0 id: nil, post_id: nil>]

>> Post.create(comments_attributes: [{}]).soiled_associations
=> [#<Comment:0x00007f01e9a08fd8 id: 3, post_id: 2>]

>> post = Post.last
>> post.comments.destroy_all
>> post.soiled_associations
=> [#<Comment:0x00007f01e99867e0 id: 3, post_id: 2>]

>> Post.create(comments_attributes: [{}])
>> post = Post.last
>> post.update(comments_attributes: [{id: 4, _destroy: true}])
>> post.soiled_associations
=> [#<Comment:0x00007f01e99a5500 id: 4, post_id: 3>]

相关问题