2

我有三个模型 model1、model12 和 mode2。模型 1 有许多模型 2 到模型 12。

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

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

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"

这也行不通。

我想在我的情况下,rails 正在检查保存的记录而不是未保存的记录。这就是为什么当已经保存的记录有model2而未保存的记录没有model2时验证不会失败。但是当保存的记录没有model2并且未保存的记录也没有model2时它会失败。

如果我的问题不清楚,请告诉我。

4

1 回答 1

1

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

我在复选框中有model2s。当我取消选中所有已检查的模型 2 并提交表单时。因为我使用的是嵌套属性,所以它会将旧的未检查模型 2 标记为销毁,并且这种销毁将在保存和验证运行之后发生。

所以rails发现一些model2存在所以没有验证错误。

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

感谢 les hill使用嵌套模型进行的后期验证

于 2013-04-25T18:37:07.230 回答