验证rails 3.2中至少存在一个关联对象

时间:2013-02-25 14:58:22

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

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

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)无论如何都应该正常工作。)

1 个答案:

答案 0 :(得分:0)

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

而不是

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