10

多態的な関係に対してスコープされた子モデルの属性の一意性を検証することは可能ですか?

たとえば、私はにfield属すると呼ばれるモデルを持っていfieldableます:

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :name, :scope => :fieldable_id
end

私は多くのフィールドを持つ他のいくつかのモデル(ページ、アイテム)を持っています。したがって、親モデルに対してフィールド名の一意性を検証する必要がありますが、問題は、ページとアイテムが同じID番号を共有することがあり、検証が失敗するはずがない場合に失敗することです。

私はこれを間違ってやっているだけですか、それともこれを行うためのより良い方法がありますか?

4

2 に答える 2

22

範囲を広げて、フィールド可能なタイプを含めます。

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :name, :scope => [:fieldable_id, :fieldable_type]
end
于 2010-03-31T21:47:56.800 に答える
0

メッセージを追加してデフォルトのメッセージを上書きしたり、スコープを使用して検証を追加したりすることもできます。

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :fieldable_id, :scope => [:fieldable_id, :fieldable_type], :message => 'cannot be duplicated'
end

en.ymlにアクセスして、次のように入力すると、ボーナスとして次のように入力します。

  activerecord:
    attributes:
     field:
       fieldable_id: 'Field'

Railsがエラーに追加するデフォルトの「件名」をここで指定したものに置き換えます。つまり、次のように言う代わりに、次のFieldable Id has been already takenようになります。

 Field cannot be duplicated
于 2016-06-10T18:45:02.090 に答える