Goed plan! Klinkt ook wel logisch.
Dan nog iets, ik heb een database met cd's, ik heb een tabel artists, elke artist heeft een of meer albums en van elk album zijn weer 1 of meer 'producten' en elk product heeft een product_type (LP, CD, etc).
Nu wil ik hiervoor een zoekmachine maken, dit gaat op een klein puntje na goed, ik heb de volgende find-aanroep:
Ruby:
1
2
3
4
5
6
7
8
| @albums = Album.find( :all,
:offset => @page*per_page,
:limit => per_page+1,
:group => "products.product_type_id,albums.id",
:order => "artists.name, albums.name",
:include => [[:products => :product_type],:artist],
:conditions => condition_sql)
|
Dit werkt perfect. Even voor de volledigheid, de query haalt alle albums met bijbehorende producten en artiesten op. De producten worden per album gegroepeerd op type. Dus als er van 1 album 2 cd's in de DB staan wordt dit maar 1x weergegeven.
Wat ik nu graag zou doen is het aantal producten dat er van een bepaald type beschikbaar is ook weergeven.
In SQL zou dit als volgt gaan (eerste regel: COUNT(products.id) AS product_type_count):
code:
1
2
3
4
5
6
7
8
| SELECT COUNT(products.id) AS product_type_count,albums.*, artists.*, products.*, product_types.*
FROM albums
LEFT OUTER JOIN artists ON artists.id = albums.artist_id
LEFT OUTER JOIN products ON albums.id = products.album_id
LEFT OUTER JOIN product_types ON products.product_type_id = product_types.id
WHERE artists.name LIKE '%jimi%'
GROUP BY product_types.id,albums.id
ORDER BY albums.name |
Nu wil ik dit dus met find() doen en dat wil niet. Ik heb dat :select parameter als volgt meegestuurd:
code:
1
| :select => 'COUNT(products.id) AS product_type_count' |
Dit veranderd echter helemaal niks aan de door rails gestuurde query plus dat ik niet zou weten hoe ik nu de 'product_type_count' property zou moeten opvragen.
Ik heb ook even gekeken naar find_by_sql maar dan gooit hij allerlei namen door elkaar. (Albums die opeens LP als titel hebben).
Iemand een idee?
Edit:
En nog iets, ik zie dat rails de volgende query uitvoert voor de 'main' query:
code:
1
2
3
4
5
6
7
8
9
| Album Load IDs For Limited Eager Loading (0.000714)
SELECT DISTINCT albums.id
FROM albums
LEFT OUTER JOIN products ON products.album_id = albums.id
LEFT OUTER JOIN product_types ON product_types.id = products.product_type_id
LEFT OUTER JOIN artists ON artists.id = albums.artist_id
WHERE (artists.name LIKE '%jimi%')
ORDER BY artists.name, albums.name
LIMIT 0, 6 |
In de query daarna doet hij:
code:
1
2
| WHERE (artists.name LIKE '%jimi%')
AND albums.id IN ('15441', '15443', '15442', '15440', '15449', '15445') |
Daar snap ik echt niks van, eerst de query uitvoeren en dan de data ophalen voor de betreffende id's, dat klinkt als dubbel zoeken...
[
Voor 13% gewijzigd door
DRAFTER86 op 28-11-2007 19:13
]