Rails 4:验证 ID 或关联的存在性之间的差异
Rails 4: Difference between validates presence on id or association
如果我在模型中有一个 'belongs_to' 关联,我想知道验证关联之间的概念差异:
class Topping < ActiveRecord::Base
belongs_to :pancake
validates :pancake, presence: true
...
并验证关联的模型 ID:
class Topping < ActiveRecord::Base
belongs_to :pancake
validates :pancake_id, presence: true
...
动机:
在过去的某个时间,一些为煎饼分配浇头的代码停止工作。将验证从关联更改为 id 'fixed' 问题,但我想知道更深层的原因。
(仅供参考,当进入代码时,煎饼是有效的,并且在数据库中,浇头适当地响应了 .pancake
和 .pancake_id
。推送运算符(pancake.toppings << topping
) 和手动分配和保存 (topping.pancake = pancake; topping.save
) 失败,出现 pancake 丢失验证错误。)
进一步调查,我发现 'presence' 验证器解析为 'add_on_blank':
http://apidock.com/rails/ActiveModel/Errors/add_on_blank
def add_on_blank(attributes, options = {})
Array(attributes).each do |attribute|
value = @base.send(:read_attribute_for_validation, attribute)
add(attribute, :blank, options) if value.blank?
end
end
这就是它所说的:如果有问题的 属性 是 blank?
,则添加验证错误
这意味着它只是一个存在性检查。因此,如果我验证一个 ID,则该 ID 必须存在。这意味着:
topping.pancake = Pancake.new
topping.valid?
会 return 错误。然而:
topping.pancake_id = -12
topping.valid?
会 return 为真。另一方面,如果我验证对象,则情况恰恰相反。除非 -12 是一个有效的索引,在这种情况下,ActiveRecord 会在收到 'pancake' 消息后自动从数据库中加载它。
继续我的问题,进一步调查显示 blank?
委托给 empty?
,并且确实有人在煎饼上定义了 empty?
,如果 return 为真没有浇头。
找到罪魁祸首,Rails 学到了一些东西。
如果我在模型中有一个 'belongs_to' 关联,我想知道验证关联之间的概念差异:
class Topping < ActiveRecord::Base
belongs_to :pancake
validates :pancake, presence: true
...
并验证关联的模型 ID:
class Topping < ActiveRecord::Base
belongs_to :pancake
validates :pancake_id, presence: true
...
动机:
在过去的某个时间,一些为煎饼分配浇头的代码停止工作。将验证从关联更改为 id 'fixed' 问题,但我想知道更深层的原因。
(仅供参考,当进入代码时,煎饼是有效的,并且在数据库中,浇头适当地响应了 .pancake
和 .pancake_id
。推送运算符(pancake.toppings << topping
) 和手动分配和保存 (topping.pancake = pancake; topping.save
) 失败,出现 pancake 丢失验证错误。)
进一步调查,我发现 'presence' 验证器解析为 'add_on_blank':
http://apidock.com/rails/ActiveModel/Errors/add_on_blank
def add_on_blank(attributes, options = {})
Array(attributes).each do |attribute|
value = @base.send(:read_attribute_for_validation, attribute)
add(attribute, :blank, options) if value.blank?
end
end
这就是它所说的:如果有问题的 属性 是 blank?
这意味着它只是一个存在性检查。因此,如果我验证一个 ID,则该 ID 必须存在。这意味着:
topping.pancake = Pancake.new
topping.valid?
会 return 错误。然而:
topping.pancake_id = -12
topping.valid?
会 return 为真。另一方面,如果我验证对象,则情况恰恰相反。除非 -12 是一个有效的索引,在这种情况下,ActiveRecord 会在收到 'pancake' 消息后自动从数据库中加载它。
继续我的问题,进一步调查显示 blank?
委托给 empty?
,并且确实有人在煎饼上定义了 empty?
,如果 return 为真没有浇头。
找到罪魁祸首,Rails 学到了一些东西。