2

モデル1、モデル12、モード2の3つのモデルがあります。モデル 1 には、モデル 2 からモデル 12 までの多数のモデルがあります。

model2 から model12 までの存在を検証する必要があります。

model1 レールの編集済みレコードを保存しようとすると、model2 を持たないレコードが保存されます。検証は、モデル 1 に既に存在する DB エントリにモデル 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"

これも機能していません。

私の場合、どういうわけかレールは保存されていないレコードではなく保存されたレコードをチェックしていると思います。そのため、既に保存されているレコードにモデル 2 があり、保存されていないレコードにモデル 2 がない場合、検証は失敗しません。ただし、保存されたレコードにモデル 2 がなく、保存されていないレコードにもモデル 2 がない場合は失敗します。

私の質問が明確でない場合はお知らせください。

4

1 に答える 1

1

問題の解決策を見つけました。

チェックボックスにmodel2がありました。チェックしたすべてのモデル2のチェックを外してフォームを送信したとき。ネストされた属性を使用していたため、古いチェックされていないモデル 2 を破棄するようにマークしていました。この破棄は保存後に発生し、その前に検証が実行されます。

そのため、レールはいくつかのモデル2が存在することを発見していたため、検証エラーはありませんでした。

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

ネストされたモデルを使用したレスヒルのポスト検証の存在のおかげで

于 2013-04-25T18:37:07.230 に答える