Rails 4:验证id或关联的存在之间的区别

时间:2015-03-12 14:18:32

标签: ruby-on-rails validation ruby-on-rails-4 model-associations

如果我在模型中有'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)因煎饼缺失验证错误而失败。)

1 个答案:

答案 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的一些东西学到了。