Czy da sie to zerobic ? (SELECT, WHERE, OR) ;]

Czy istnieje jakas railsowa metoda, która pozwolilaby mi znalesc wszystkie rekordy gdzie jeden z warunkow moze przyjmowac rozne wartosci ?
chodzi mi o wyszukanie dla takiego np. zapytania: ‘SELECT * from articles WHERE category_id = 1 OR category_id = 2 OR category_id=3’ ?
Aha, przyjmijmy ze id kategorii sa w tablicy o nieznanym rozmiarze

Obczaj find w api railsów.

Category.find([1,2,3]).

Jeżeli tablica zawiera tablice, albo nile to też za bardzo nie musisz się martwić, bo jak spojrzysz do źródeł, to zobaczysz taką konstrukcję:

ids = ids.flatten.compact.uniq

[quote=balinski]Czy istnieje jakas railsowa metoda, która pozwolilaby mi znalesc wszystkie rekordy gdzie jeden z warunkow moze przyjmowac rozne wartosci ?
chodzi mi o wyszukanie dla takiego np. zapytania: ‘SELECT * from articles WHERE category_id = 1 OR category_id = 2 OR category_id=3’ ?
Aha, przyjmijmy ze id kategorii sa w tablicy o nieznanym rozmiarze[/quote]

ids = [1, 2, 3] articles = Article.find( :all, :conditions => "category_id IN (#{ids.join( ', ' )})" )

Ale po co takie konstrukcje dziwne :slight_smile:

Nie lepiej skorzystać z asocjacji i z tego co napisałem powyżej?

ids = [1, 2, 3] articles = category.articles.find(ids)
Dla mnie to ładniej wygląda :wink:

[quote=drogus]Nie lepiej skorzystać z asocjacji i z tego co napisałem powyżej?

ids = [1, 2, 3] articles = category.articles.find(ids)
[/quote]
Owszem, Twoje rozwiązania wyglądają o niebo ładniej, ale chyba rozwiązują troszkę inny problem.

Pierwsze daje listę kategorii. Drugie daje listę artykułów z jednej, określonej kategorii. Tymczasem pytanie było o listę artykułów z wielu kategorii.

Można oczywiście połączyć Twoje rozwiązania: wziąć listę kategorii, a następnie dla każdej kategorii listę artykułów - ale w zaprezentowanej formie poskutkowałoby to niepotrzebnie dużą liczbą żądań do bazy.

No chyba, że czegoś nie zaczaiłem?

Natomiast bardzo podoba mi się Twoja uwaga o spłaszczeniu, wyczyszczeniu i “zunikalnieniu” listy id:

ids = ids.flatten.compact.uniq

To jest akurat tak jak mówiłem kawałek z którejś z metod wywoływanych przez find. Więc podziękowania dla rails core team :wink:

[quote]Owszem, Twoje rozwiązania wyglądają o niebo ładniej, ale chyba rozwiązują troszkę inny problem.

Pierwsze daje listę kategorii. Drugie daje listę artykułów z jednej, określonej kategorii. Tymczasem pytanie było o listę artykułów z wielu kategorii.[/quote]
Rzeczywiście, nastawiłem się na jeden tor myślenia i tak już zostało do końca. :wink:

Jak wrócę do domu to sprawdzę, ale chyba jest to do wykonania w jednym zapytaniu bez uciekania się do sql’a. Pytanie tylko czy warto :slight_smile:

Tak jak myślałem można zrobić to bardzo prosto :slight_smile:

Generuje to analogiczne do podanego wyżej zapytanie:

A na deser fajny sposób na podpatrzenie jakie zapytania się właściwie wykonają. Dużo wygodniejsze od śledzenia logów - konsola railsowa to wspaniały wynalazek :wink:

Świetne rozwiązanie! Teraz wydaje się oczywiste :slight_smile:

Wygląda ładnie, ale niektórzy twierdzą, że używanie find_by i find_all_by jest wolne, bo jest wywoływane z użyciem method_missing. Jak na razie nie zauważyłem nic co na to by wskazywało, więc nie wiem jak się do tego ustosunkować. Sam używam często gęsto, bo znacznie upraszcza kod :slight_smile: