【问题标题】:validate the presence of at least one association object in rails 3.2验证 rails 3.2 中至少存在一个关联对象
【发布时间】:2013-02-25 14:58:21
【问题描述】:

我有一个小问题,我无法解决。我想验证至少有一个关联模型。如下所示

class User < ActiveRecord::Base
has_many :things
validates_presence_of :things
end

class Thing < ActiveRecord::Base
belongs_to :user
end

当我通过#update_attributes 更新我的模型时,这工作正常,但是当我简单地设置@user.things = [] 时,我能够在数据库中获取无效数据。我解决这个问题的方法是覆盖 setter 方法

def things=(val)
  begin
    if val.blank?
      errors.add(:things, "not valid")
      raise SomeError
    end
    super
  rescue SomeError
    false
  end
end

但不知何故,这感觉不对。有没有办法通过验证和/或回调来存档相同的结果,最好让#things=返回false(而不是val)并且@user.things不会改变(我的意思是缓存的@user.things , @user.things(true) 应该可以正常工作)。

【问题讨论】:

    标签: ruby-on-rails validation callback ruby-on-rails-3.2


    【解决方案1】:

    您可以创建一个自定义验证器来检查事物的存在。

    代替

    validates_presence_of :things

    你可以的

    validate :user_has_things

    def user_has_things
     if self.things.size == 0
      errors.add("user has no thingies")
     end
    end
    

    【讨论】:

    • 那太容易了 :) 当你调用 #update_attributes(things: []) 时它可以工作,但当你调用 #things= 时它不会,因为这不会验证 User 或者如果你验证User 通过validate_associated :userThing 模型中,然后user.things 错过了您正在验证的东西(即user.things = [thing,...] 出现在user.things=[] 的验证中)
    猜你喜欢
    • 2011-08-21
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多