Walidacje i zapytania
Integralność danych i odpytywanie
Walidacje i zapytania to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Dlaczego stosować walidację
Walidacje chronią dane, zanim trafią one do bazy danych. Są wykonywane podczas zapisywania rekordu i odrzucają nieprawidłowe dane, wyświetlając pomocne komunikaty.
- Nie dopuszczają do zapisania niepoprawnych danych (brakujących nazw, nieprawidłowych adresów e-mail).
- Są wykonywane w Ruby, więc wyświetlanie komunikatów użytkownikom jest proste.
- Uzupełniają ograniczenia bazy danych, ale ich nie zastępują.
Walidacja obecności
Najczęściej stosowana reguła to validates :field, presence: true, która wymaga podania niepustej wartości. Próba zapisu bez niej kończy się niepowodzeniem i powoduje zarejestrowanie błędu.
class User < ApplicationRecord
validates :name, presence: true
end
# User.create(name: "") fails to saveWalidacja unikalności
uniqueness: true zapobiega zduplikowanym wartościom, na przykład dwóm użytkownikom z tym samym adresem e-mail. Należy połączyć ją z unikalnym indeksem bazy danych, ponieważ sama walidacja może prowadzić do warunku wyścigu przy dużej współbieżności.
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
endFormat i długość
Inne wbudowane walidatory:
length: { minimum: 8 }do określania limitów długości.format: { with: /regex/ }do sprawdzania wzorców.numericality: truedo sprawdzania liczb.inclusion: { in: [...] }do określania dozwolonych wartości.
class User < ApplicationRecord
validates :password, length: { minimum: 8 }
validates :age, numericality: { greater_than: 0 }
endvalid? i errors
Proszę wywołać valid?, aby uruchomić walidacje bez zapisywania rekordu. Po nieudanym zapisie obiekt record.errors zawiera problemy, a errors.full_messages zwraca czytelne komunikaty do interfejsu użytkownika.
user = User.new(name: "")
if user.valid?
user.save
else
puts user.errors.full_messages
endsave a save!
Dwa sposoby zapisu:
savezwracatrue/false, więc logikę można rozgałęzić na podstawie wyniku.save!zgłaszaRecordInvalidw razie niepowodzenia, co jest przydatne, gdy nieprawidłowe dane powinny skutkować wyjątkiem.
Ten sam wzorzec dotyczy create/create! oraz update/update!.
user.save # => false if invalid
user.save! # => raises if invalidNiestandardowe walidacje
W przypadku reguł wykraczających poza wbudowane walidatory należy napisać metodę i zarejestrować ją za pomocą validate. Problemy należy dodawać przez errors.add.
class User < ApplicationRecord
validate :name_not_admin
def name_not_admin
if name == "admin"
errors.add(:name, "cannot be admin")
end
end
endZapytania z użyciem where
Interfejs zapytań zaczyna się od where, które filtruje wiersze. Zwraca ono leniwą relację, którą można dalej łączyć z innymi warunkami, zanim zapytanie trafi do bazy danych.
User.where(active: true)
User.where("age > ?", 18)
User.where(role: ["admin", "editor"])Sortowanie i ograniczanie wyników
Wyniki można kształtować za pomocą metod, które można łączyć:
order(created_at: :desc)sortuje wyniki.limit(10)ioffset(20)obsługują paginację.select(:id, :name)wybiera kolumny.
User.where(active: true)
.order(created_at: :desc)
.limit(10)Agregaty i leniwe ładowanie
Pomocnicze metody agregujące uruchamiają funkcje bazy danych: count, sum(:amount), average(:age), maximum, minimum. Relacje są lazy; zapytanie jest wykonywane dopiero podczas iterowania po wynikach, wywołania agregatu lub użycia to_a.
User.where(active: true).count
Order.sum(:total)
User.average(:age)Scope
Scope nadaje nazwę wielokrotnego użytku zapytaniu, dzięki czemu można je przejrzyście komponować. Scope'y zwracają relacje i można je łączyć ze sobą oraz z where.
class User < ApplicationRecord
scope :active, -> { where(active: true) }
scope :adults, -> { where("age >= ?", 18) }
end
User.active.adultsSzybki test
Proszę sprawdzić, czy rozumieją Państwo walidacje i zapytania.
Podsumowanie: walidacje i zapytania
Poznali Państwo sposoby ochrony i pobierania danych:
- Walidacje, takie jak obecność, unikalność, długość i format, chronią operacje zapisu.
valid?ierrorszgłaszają problemy, asave!zgłasza wyjątek.- Niestandardowe walidacje obsługują specjalne reguły.
where,order,limit, agregaty i scope'y służą do budowania leniwych zapytań.
To kończy kurs dotyczący modeli i Active Record.
Często zadawane pytania
Czy lekcja „Walidacje i zapytania” jest bezpłatna?
Tak — pełny tekst „Walidacje i zapytania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Walidacje i zapytania”?
Integralność danych i odpytywanie Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?
Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Walidacje i zapytania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?
Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy Active Record
- Migracje
- Powiązania
- Walidacje i zapytania