使用符号时,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 }
不会让您访问父实例。
在任何情况下您都无法访问子实例。
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 }
不会让您访问父实例。
在任何情况下您都无法访问子实例。