3

「アクティブ」フラグを使用してアイテムを破棄する代わりにソフト削除するモデルがあります。モデルには 'name' プロパティがあり、アクティブなアイテム間で一意でなければなりません。conditionsで修飾子を使用しようとしましたvalidates_uniqueness_ofが、アクティブなアイテムと非アクティブなアイテムの両方で一意性をチェックしているようです。私は何を間違っていますか?

class Foo < ActiveRecord::Base

  attr_accessible :name, :active
  validates_uniqueness_of :name, conditions: -> { where(active:true) }

end
4

4 に答える 4

5

scopeこれには、修飾子とif修飾子を組み合わせて使用​​できます。

scope :active, where(:active => true)
validates :name, :uniqueness => {:message => 'That name is in use', :if => :active?, :scope => :active}

これにより、アクティブなアイテムのみが検証をトリガーし、検証ではアクティブなアイテム間でのみ一意性が考慮されます。

Rails 3 と 4 で動作することを確認しました。

于 2013-08-07T12:10:53.150 に答える
4

スコープが条件と異なる場合は、一意性オブジェクトに条件キーを追加することで、それらの条件内でスコープを適用できます。

scope :active, -> { where(active: true) }

validates :active, uniqueness: {
  scope: :name,
  message: 'name is in use',
  conditions: -> { active }
}
于 2016-12-26T12:25:56.760 に答える
1

これは私のために働く:

validates :active, :uniqueness => { :scope => :name, :message => 'name is in use'}, :if => :active
于 2013-08-07T12:06:56.227 に答える