Wpis z mikrobloga

#rails #ruby #rubyonrails #programowani

Nigdy nie byłem pro w zapytaniach SQL (będzie trzeba w końcu nadrobić braki), ale muszę poradzić sobie z takim zadaniem i mam nadzieję, że ktoś z was ogarnia :)

Piszę apkę przeszukującą themesy pod wordpressa na podstawie ich właściwości (features). Każdy Theme może mieć kilka Feature za pośrednictwem ThemeFeature (relacja Theme hasmany Features :through => ThemeFeatures) .

Moim zadaniem jest zbudować zapytanie SQL, które pobierze z bazy danych wszystkie Themes, które posiadają podane Feature.

Przykład:

Themes

id| name

1 | szablon
a

2 | szablonb

Features

id | name

1 | responsywnosc

2 | support

3 | różne kolory

4 | różne typy postów

ThemeFeatures

theme
id | featureid

1 | 2

1 | 3

2 | 3

2 | 4

Więc kiedy na wejście podam id Featurs [3, 4] to powinno zwrócić szablon
b, kiedy podam Featurs [3] to powinno zwrócić szablona i szablonb (oba mają różne kolory).

Moje pierwsze podejście do tematu było takie: Theme.joins(:features).where(:features => {:id => [3, 4]}) niestety takie zapytanie w skrócie generuje SELECT FROM Themes ... JOIN Features ... WHERE.... .... features.id IN (3, 4) .... , czyli pobierze wszystkie Themes, które posiadają features znajdujące się w tablicy, co jest błędne ponieważ zwrócą się w tym wypadku szablona i szablonb, a powinien zwrócić się tylko szablon_b.

Chodzi, o to, żeby pobrać Theme, które mają dokładnie wszystkie Features.id, które znajdują się w tablicy, a nie którykolwiek z nich.

Na pewno jest jakieś prosta, fajna formuła SQL, której nie mogę wygooglować, dlatego mirkuję tutaj ;]
  • 2