2013-05-24 16 views
5

W moim modelu mam to:poprawny sposób zapobiec zduplikowane rekordy w Rails

validates :name, :presence => true, :uniqueness => true 

W moim kontroler mam:

... 
if @location.save 
    format.html { redirect_to @location, :notice => 'Location was successfully created.' } 
    format.json { render :json => @location, :status => :created } 
... 

które z powodzeniem tworzy rekord, jeśli nie ma już nagrywaj z tą nazwą w tabeli. Uważam, że dobrą praktyką jest sprawdzenie przed wstawieniem potencjalnie zduplikowanego rekordu zamiast polegania na ograniczeniach DB?

Chyba powinienem dodać coś do kontrolera, żeby to sprawdzić? Jaki jest właściwy sposób na zrobienie tego?

Wielkie dzięki.

Odpowiedz

6

Walidacje są wykonywane przez szyny, zanim rekord trafi do bazy danych. Jeśli rekord nie zostanie zatwierdzony, nie zostanie zapisany, a .save zwróci false, co spowoduje wykonanie klauzuli else kontrolera. Ta klauzula zwykle ponownie wyświetla stronę, która została przesłana, z wyświetlonymi błędami, aby można je było poprawić.

Zakładając, że twój kontroler jest zbudowany w ten sposób, nie musisz robić nic więcej. Powinieneś oczywiście upewnić się, że wszelkie ograniczenia bazy danych są odzwierciedlane w twoich sprawdzaniach poprawności, w przeciwnym razie rekord może przekazać sprawdzanie poprawności, ale spowoduje błąd od naruszenia ograniczenia, gdy został zapisany.

5

Nie musisz nic robić w kontrolerze.

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly. 
2

Masz prawidłowy sposób sprawdzania wyjątkowości w Railsach i to przez walidacje. Nie musisz tego sprawdzać w kontrolerze, ponieważ właśnie to sprawdza dla ciebie.

Pamiętaj, że dodanie sprawdzania wyjątkowości nie gwarantuje, że będziesz mieć unikalny rekord w bazie danych. Jest to ładnie wyjaśnione w validates_uniqueness_of documentation w interfejsie API.

6

Dodaj unikalny indeks do swojej bazy danych. W ten sposób, jeśli coś przejdzie przez walidację modelu (rzadko, ale technicznie możliwe), zapytanie o zapis do bazy danych zawiedzie.

4

Twoja walidacja jest prawidłowa. Podobnie jak wszystkie inne powyższe odpowiedzi, jednak zakładając, że chcesz sprawdzić poprawność wielu pól, na przykład zakładając, że masz listę życzeń, która zajmuje user_id i item_id, potrzebujesz, aby każdy element był dodawany tylko raz przez użytkownika, dla tego rodzaju scenariusza dodać tego typu walidacji do modelu

Class class_name < ActiveRecord::Base 
    validates_uniqueness_of :item_id, scope: :user_id 
end 
+0

można użyć 'potwierdza: item_id, wyjątkowość {zakres:: user_id}' dotyczące http://www.rubydoc.info/github/bbatsov/rubocop/Rubocop/Cop/Rails/Validation – Math

Powiązane problemy