5

私は、approper_note、po_number、および state_id を含む請求書モデルを持っています。

チェックするための検証が必要です:

validates :approver_note, :presence => true, {:scope => state_id == 3}
validates :po_number, :presence => true, {:scope => state_id ==2}

そのため、ユーザーが state_id = 3 を選択した場合、メモを入力する必要があります。state_id = 2 を選択した場合は、po_number を入力する必要があります。

どんな支援も素晴らしいでしょう...ありがとう!

4

1 に答える 1

7

:ifの代わりにオプションを探しています:scope

validates :approver_note, :presence => true,
  :if => lambda { |invoice| invoice.state_id == 3 }

しかし、ラムダは少し醜いので、私はおそらくあなたがやっていることを少し良くカプセル化するためのメソッドを追加するでしょう:

validates :approver_note, :presence => true, :if => :requires_note?
validates :po_number, :presence => true, :if => requires_po_number?

def requires_note?
  state_id == 3
end

def requires_po_number?
  state_id == 2
end

が3の場合に必要なさまざまな属性が実際にある場合state_idは、メモだけでなく、次のようなものが必要になる場合があります。

validates :approver_note, :presence => true, :if => :green_state?
validates :po_number, :presence => true, :if => orange_state?

def green_state?
  state_id == 3
end

def orange_state?
  state_id == 2
end

(「緑」を-私は知らない-「high_documentation」またはあなたの世界で意味のあるものに置き換えてください。)

または、州にそれが何であるかを決定させたい場合もあります。

def green_state?
  state.green?
end

「3」や「2」ではなく、コード内の用語を実際の言語により厳密に準拠させるのに役立ちます。

于 2012-04-18T20:00:10.230 に答える