Tworzenie klauzuli Rails ActiveRecord where
Jaki jest najlepszy sposób na skonstruowanie klauzuli Where przy użyciu Rails ActiveRecord? Na przykład załóżmy, że mam akcję kontrolera, która zwraca listę postów na blogu:
def index
@posts = Post.all
end
Załóżmy teraz, że chcę móc przekazać parametr url, aby ta akcja kontrolera zwracała tylko posty od określonego autora:
def index
author_id = params[:author_id] if author_id.nil?
@posts = Post.all
else
@posts = Post.where("author = ?", author_id)
end
end
Nie bardzo mi się to podoba. Gdybym dodał porządkowanie lub paginację lub, co gorsza, bardziej opcjonalne parametry ciągu zapytania URL do filtrowania, ta akcja kontrolera stałaby się bardzo złożona.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
5 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
jest zasadniczo leniwym ładowanym odpowiednikiem Post.all (ponieważ Post.all natychmiast zwraca tablicę , podczas gdy Post.scoped po prostu zwraca obiekt relacji). To żądanie nie zostanie wykonane do
naprawdę nie będziesz próbował powtórzyć tego w widoku (wywołując .each).
Anonimowy użytkownik
Potwierdzenie od:
IMHO ma to większy sens, jeśli myślisz o RESTful API, indeks oznacza wypisanie wszystkiego i pobranie (lub pokazanie), aby otrzymać żądanie i pokazać to!
Anonimowy użytkownik
Potwierdzenie od:
Niektóre obszary są wprowadzane do modelu ze sprawdzeniem istnienia przekazanego parametru:
Następnie w kontrolerze możesz po prostu umieścić tyle filtrów, ile chcesz, na przykład:
Parametr może wtedy być pojedynczą wartością lub listą wartości oddzielonych przecinkami, z których obie działają poprawnie.
Jeśli parametr nie istnieje, po prostu pomija tę klauzulę where i nie filtruje pod kątem tego konkretnego kryterium. Jeśli parametr istnieje, ale jego wartość jest pustym ciągiem, to wszystko będzie „filtrować”.
Oczywiście ta decyzja nie będzie pasować do wszystkich okoliczności. Jeśli masz stronę widoku z włączonymi wieloma filtrami, ale kiedy po raz pierwszy ją otworzysz, chcesz pokazać wszystkie swoje dane, a nie żadne dane, dopóki nie naciśniesz przycisku przesyłania lub czegoś podobnego (tak jak zrobiłby to ten kontroler), musisz trochę go podkręcić.
Próbowałem wstrzyknąć to w SQL i railsy wydają się dobrze radzić sobie z utrzymaniem wszystkiego w bezpiecznym miejscu, o ile widzę.
Anonimowy użytkownik
Potwierdzenie od:
Następnie możesz zrobić coś takiego:
? filter [author_id] = 1 & amp; filter [post_date] = ... i tak dalej.
Anonimowy użytkownik
Potwierdzenie od:
http://guides.rubyonrails.org/routing. html
http://guides.rubyonrails.org/routing.html
(przewiń w dół do zasobów zagnieżdżonych 2,7).