アソシエーションを通じて多形has_manyのエントリの重複を防ぐ簡単な、または少なくともエレガントな方法はありますか?
タグ付けできるストーリーとリンクの2つのモデルがあります。ここではプラグインを使用しないという意識的な決断をしています。私は実際に起こっていることすべてを理解し、私が完全に理解していない他の誰かのコードに依存しないようにしたいです。
私の質問が何になっているのかを確認するために、コンソールで次のコマンドを実行した場合(ストーリーオブジェクトとタグオブジェクトがデータベースにすでに存在していると仮定)
s = Story.find_by_id(1)
t = Tag.find_by_id(1)
s.tags << t
s.tags << t
私のタギング結合テーブルには2つのエントリが追加され、それぞれに同じ正確なデータがあります(tag_id = 1、taggable_id = 1、taggable_type = "Story")。それは私にはあまり適切ではないようです。そこで、これを防ぐために、タグ付けモデルに次のものを追加しました。
before_validation :validate_uniqueness
def validate_uniqueness
taggings = Tagging.find(:all, :conditions => { :tag_id => self.tag_id, :taggable_id => self.taggable_id, :taggable_type => self.taggable_type })
if !taggings.empty?
return false
end
return true
end
ほぼ意図したとおりに機能しますが、ストーリーまたはリンクに重複するタグを追加しようとすると、ActiveRecord :: RecordInvalid:Validationfailed例外が発生します。リストに関連付けを追加すると、保存と呼ばれるようです。(sansを保存するのではなく!)何かがうまくいかなかった場合に、単にfalseを返すのではなく、例外を発生させるメソッド。それは私がしたいことではありません。新しいタグを追加する試みはすべてtry/catchで囲むことができると思いますが、それは例外を予期してはならないという考えに反し、これは私が完全に期待していることです。
重複が存在するためにオブジェクトをデータベースにサイレントに保存しないだけの場合に例外を発生させない、これを行うためのより良い方法はありますか?