1

私のモデルでは package.rb

  validates_presence_of :duration, :unless => :expiration_date?
  validates_presence_of :expiration_date, :unless => :duration?

これらのうちの 1 つだけを入力する必要があります。その他のフィールドは nil に設定する必要があります。そのうちの 1 つだけが値を持つ必要があります。それでも、これらのフィールドの両方でパッケージを作成できます。何かが欠けているか、他の方法を使用する必要がありますか? これはこれを行う正しい方法ではありませんか?

4

2 に答える 2

1

カスタム検証を作成してみてください。

validate :expiration

def expiration
  unless duration or expiration_date
    errors.add_to_base "Need a way to determine expiration"
  end
end
于 2012-12-08T21:06:19.730 に答える
0

迅速で汚い解決策:

require 'active_model'

class Person
  include ActiveModel::Validations

  attr_accessor :aa, :bb

  validate :only_one_present

  def initialize(options = {})
    self.aa = options[:aa]
    self.bb = options[:bb]
  end

  private

  def only_one_present
    if both_present || no_attr_present
      errors.add(:base, 'Invalid!')
    end
  end

  def both_present
    !aa.nil? && !aa.empty? && !bb.nil? && !bb.empty?
  end

  def no_attr_present
    (aa.nil? || aa.empty?) && (bb.nil? || bb.empty?)
  end
end

puts Person.new(aa: 'asad', bb: 'sdsd').valid? # => false
puts Person.new(aa: nil, bb: 'sdsd').valid? # => true
puts Person.new(aa: 'asad', bb: nil).valid? # => true
puts Person.new(aa: nil, bb: nil).valid? # => false

もちろん、最初に適切な仕様を作成する必要があり、そのためのバリデータ クラスを抽出できます。

編集:

またはActiveSupport を使用している場合は、変更nil?およびempty?組み合わせが可能です。present?blank?

于 2012-12-08T21:17:20.417 に答える