has_and_belongs_to_many :categories, :uniq => trueale niestety nie zawsze.
Aby zabezpieczyć się przed umieszczaniem duplikatów najpierw robimy migrację, która przygotuje unikalny indeks zabezpieczający bazę danych przed zduplikowaniem wpisu:
. add_index :categories_firms, [ :category_id, :firm_id ], :unique => true, :name => 'unique_by_category_and_firm' .Teraz co prawda nie da się zrobić duplikowanego wpisu, ale baza danych wywala błędy.
Przjdźmy więc do modelu firmy i tam dopiszmy do has_and_belongs_to_many:
. has_and_belongs_to_many :categories, :uniq => true, :before_add => :validates_category .czyli zanim dokona się wpisu należałoby wykonać jakąś walidację:
def validates_category(category) raise ActiveRecord::Rollback if self.categories.include? category end
Proste, łatwe i przyjemne.
Inspirację zaczerpnąłem z
http://stackoverflow.com/questions/4988630/habtm-uniqueness-constraint