使用符号时,reject_if 作用于父模型还是子模型?

Does reject_if act on the parent model, or the child, when a symbol is used?

ActiveRecord 嵌套属性的文档提到能够使用 :reject_if:

的符号

Alternatively, :reject_if also accepts a symbol for using methods:

class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts, reject_if: :new_record?
end

class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts, reject_if: :reject_posts

  def reject_posts(attributes)
    attributes['title'].blank?
  end
end

我假设 new_record? 是在 class Post(子对象)的模型上调用的方法,但是 reject_posts 是一个方法调用了 class Member(父对象)的模型。

这是怎么回事?它会尝试在父项和子项上调用该方法吗?

它是在父级上调用的。 reject_if 所做的是在谓词失败时拒绝属性的散列。这发生在哈希用于初始化新记录之前,因此在子项上调用它不是 applicable/possible.

如果您需要访问父实例,请使用像这样的符号:

... reject_if: :call_a_parent_instance_method

def call_a_parent_instance_method(attrs)
  # here self is a parent instance and I have access to child attributes :)
end

内联过程符号如

... reject_if: proc {|attrs| this_instance_method_call_will_raise_exception }

不会让您访问父实例。

在任何情况下您都无法访问子实例。