0

ContributionRewardモデルがあります。貢献belongs_toは報酬です。寄付が有効になるのは、その金額が報酬の金額よりも大きい場合のみですminimum_contribution

ので、私は持っています

Class Contribution < ActiveRecord::Base
  attr_accessible :reward_id, :reward
  belongs_to :reward

  validates_presence_of :amount
  validates_numericality_of :amount, greater_than: 0
  validates_presence_of :reward

  validates_each :amount, unless: SOMECONDITION do |contribution, attr, amount|
    reward = contribution.reward
    contribution.errors.add(attr,
                            "Contribution must be at least #{reward.minimum_contribution}") unless amount > reward.minimum_contribution
  end
end

私の質問は、何を置くのが適切かということですSOMECONDITION。この検証を実行する前に、次のことを確認する必要があります。

  1. コントリビューションの有効性が定義されています(または数値である場合もあります)。そうしunless value > reward.minimum_contributionないと、nilと比較できないため、比較するとエラーが発生します。
  2. 貢献の報酬が定義されます
  3. コントリビューションの報酬のminimum_contributionが定義され、数値

私はこれをすべてラムダで行うべきSOMECONDITIONですか?1回の検証で非常に多くの警備員がいることについて何かが間違っていると感じています。私はこれを適切に設計していますか?たとえば、実際にunless amount > contribution.reward.minimum_contributionいつであるかなど、検証で例外をスローすることは適切な設計ですか?(明らかに、私は常に量が数値であることを期待していますが、検証でどれほど妄想的である必要があるか/正確に何を信頼できるかわかりません)amountnil

4

1 に答える 1

1

次のように置き換えることができますvalidates_each :amount

...
validate :validate_mininum_amount

def validate_mininum_amount
  errors.add :amount, "some error message" if amount.to_i < reward.min_contribution
end
...

注:追加すると、金額がの場合に.to_i確実になります。または、nilの特定のチェックを追加することもできます。メソッドに、必要な他のチェックを追加します。0nilvalidate_mininum_amount

于 2012-07-15T05:23:10.793 に答える