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的一些知识。