Rails 4:validationid或关联的存在之间的区别

如果我在模型中有’belongs_to’关联,我想知道validation关联之间的名义差异:

class Topping < ActiveRecord::Base belongs_to :pancake validates :pancake, presence: true ... 

并validation关联的模型ID:

  class Topping < ActiveRecord::Base belongs_to :pancake validates :pancake_id, presence: true ... 

动机:

为煎饼分配顶部的一些代码在过去的某个时间停止了工作。 将validation从关联更改为id’修复’问题,但我想知道更深层次的原因。

(仅供参考,当进入代码时,煎饼有效且在数据库中,顶部适当地响应.pancake.pancake_id 。推送操作符( pancake.toppings << topping )和手动分配并保存( topping.pancake = pancake; topping.save )因煎饼缺少validation错误而失败。)

进一步调查,我发现’presence’validation器解析为’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?则会添加validation错误blank?

这意味着它只是一个存在检查。 因此,如果我validation了id,则该id必须存在。 这意味着:

 topping.pancake = Pancake.new topping.valid? 

会返回false。 然而:

 topping.pancake_id = -12 topping.valid? 

会回归真实。 另一方面,如果我validation对象,则完全相反。 除非-12是有效索引,否则ActiveRecord会在收到’pancake’消息时自动从数据库加载它。

继续我的问题,进一步调查显示blank? 代表们empty? ,确实有人定义了empty? 在煎饼上,如果没有浇头,则返回true。

罪魁祸首找到了,关于Rails的一些知识。