如果我在模型中有'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'修复'问题,但我想知道更深层次的原因。
(仅供参考,当进入代码时,煎饼有效并且在数据库中,顶部适当地响应了.pancake
和.pancake_id
。推送操作符(pancake.toppings << topping
)和手动分配和保存(topping.pancake = pancake; topping.save
)因煎饼缺失验证错误而失败。)
答案 0 :(得分:4)
进一步调查,我发现&#39;存在&#39;验证器解析为&#39; add_on_blank&#39;:
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?
会返回false。但是:
topping.pancake_id = -12
topping.valid?
会返回true。另一方面,如果我验证对象,则完全相反。除非-12是有效索引,否则ActiveRecord会在收到“煎饼”后自动从数据库加载它。消息。
继续讨论我的问题,进一步的调查显示blank?
委托给empty?
,确实有人在煎饼上定义empty?
,如果没有浇头,则返回true。
Culprit发现了,Rails的一些东西学到了。