Rails validates_presence_of正在检查已保存的记录而不是已编辑的记录

问题描述:

我有三个模型model1,model12和mode2。 Model1有许多model2到model 12.Rails validates_presence_of正在检查已保存的记录而不是已编辑的记录

我必须通过model12验证model2的存在。

当我尝试保存model1的编辑记录时,rails正在保存没有model2的记录。当model1中已经存在的数据库条目没有model2信息时,验证仅失败。

class model1 < ActiveRecord::Base 
    has_many :model12, :dependent => :destroy, :include => [:model] 
    has_many :model2, :through => :model12, :uniq => true 

    validates_presence_of :model12, :message => "must be present" 

我试图

validates_presence_of :model2, :message => "must be present" 

这也不能正常工作。

我想我的情况不知何故轨道检查保存的记录,而不是未保存的记录。 这就是为什么当已保存的记录有model2和未保存的记录没有model2验证不会失败。但是,如果保存的记录没有模型2,未保存的记录也没有模型2,则失败。

如果我的问题不清楚,请让我知道。

+0

我想你应该添加自定义验证这一点。 – 2013-04-25 08:13:57

+0

@SanthoshK我正在做的就像 验证do | model1 | model1.error(“必须选择”)if model1.model12s.blank? 结束 但这里也有同样的问题,这个“如果model1.model12s”返回在DB中的旧值。 – Nitesh 2013-04-25 08:56:54

+1

这对我有用。验证:address_present def address_present self.errors.add(:name,“can not be blank”)if self.addresses.size == 0 end – 2013-04-25 09:04:46

我找到了我的问题的解决方案。

我在复选框中有model2s。当我没有选中所有检查过的model2并提交表单时。因为我使用的是嵌套属性,所以它会标记旧的未经检查的model2s以进行销毁,并且在此之前保存并验证之后会发生这种破坏。

所以rails找到了一些model2s,所以没有验证错误。

class model1 < ActiveRecord::Base 

    has_many :model12, :dependent => :destroy, :include => [:model] 
    has_many :model2, :through => :model12, :uniq => true 

    accepts_nested_attributes_for :model2, 
    :allow_destroy => true, 
    :reject_if => proc {|m| m.blank? } 

    validate :must_have_one_model2 

    def must_have_one_model2 
    errors.add(:model2s, 'must have one model2') if model12s_count_valid? 
    end 

    def model12s_count_valid? 
    model12s.reject(&:marked_for_destruction?).count >= 1 
    end 
end 

感谢莱斯·希尔的帖子validation presence with nested models