Verhindern von Duplikaten nur in der Ansicht (Faule Lösung)
Die folgenden nicht verhindern, dass doppelte Beziehungen in die Datenbank geschrieben werden, es wird lediglich sichergestellt find
Methoden ignorieren Duplikate.
In Rails 5:
has_and_belongs_to_many :tags, -> { distinct }
Anmerkung: Relation#uniq
wurde in Rails 5 abgeschrieben ( übergeben. )
In Rails 4
has_and_belongs_to_many :tags, -> { uniq }
Verhindern von Duplikaten Daten nicht gespeichert werden (beste Lösung)
Option 1: Verhindern Sie Duplikate vom Controller:
post.tags << tag unless post.tags.include?(tag)
Allerdings könnten mehrere Benutzer versuchen post.tags.include?(tag)
zur gleichen Zeit, so dass dies den Bedingungen des Wettlaufs unterliegt. Dies wird erörtert aquí .
Aus Gründen der Robustheit können Sie dies auch in das Post-Modell (post.rb) aufnehmen
def tag=(tag)
tags << tag unless tags.include?(tag)
end
Option 2: Einen eindeutigen Index erstellen
Die narrensicherste Methode zur Vermeidung von Duplikaten ist es, doppelte Beschränkungen auf der Datenbankebene zu haben. Dies kann erreicht werden, indem man eine unique index
auf dem Tisch selbst.
rails g migration add_index_to_posts
# migration file
add_index :posts_tags, [:post_id, :tag_id], :unique => true
add_index :posts_tags, :tag_id
Sobald Sie den eindeutigen Index haben, führt der Versuch, einen doppelten Datensatz hinzuzufügen, zu einer ActiveRecord::RecordNotUnique
Fehler. Dies zu behandeln, würde den Rahmen dieser Frage sprengen. Ansicht diese SO-Frage .
rescue_from ActiveRecord::RecordNotUnique, :with => :some_method