Posiadam modele: “Album”, “Category” połączone relacją “has_and_belongs_to_many”. Chciałbym uzyskać z bazy nazwy wszystkich kategorii wraz z ilością albumów, które należą do każdej z nich. Zastosowałem takie coś:
--- !map:ActiveSupport::OrderedHash
"1": 2
"2": 1
"3": 2
"4": 1
"5": 1
Wartości się zgadzają, natomiast chciałbym zamiast id kategorii otrzymać jej nazwę (pole ‘title’). Czy da się to zrobić jednym zapytaniem czy też trzeba tworzyć nową kolekcję z połączeń dwóch zapytań: powyższego i “Category.all” ?
PROBLEM 2:
Wyciągam wszystkie albumy danej kategorii zapytaniem:
@albums = Category.find(params[:id]).albums
Chciałbym jednak dodać warunek, aby pobierał albumy tylko z flagą “published” ustawioną na “1”. Jakaś sugestia?
Posiadam modele: “Album”, “Category” połączone relacją “has_and_belongs_to_many”. Chciałbym uzyskać z bazy nazwy wszystkich kategorii wraz z ilością albumów, które należą do każdej z nich. Zastosowałem takie coś:
--- !map:ActiveSupport::OrderedHash
"1": 2
"2": 1
"3": 2
"4": 1
"5": 1
Wartości się zgadzają, natomiast chciałbym zamiast id kategorii otrzymać jej nazwę (pole ‘title’). Czy da się to zrobić jednym zapytaniem czy też trzeba tworzyć nową kolekcję z połączeń dwóch zapytań: powyższego i “Category.all” ?[/quote]
Da się to zrobić:
Nie wiem, czy dokładnie tak będzie to działać, ale mam nadzieję, że idea jest zrozumiała. Mieliśmy problem w Postgresie, który wymaga po dodaniu GROUP BY, wymienienia wszystkich kolumn w części SELECT. Gdybyś miał tego typu problem, to listę kolumn można uzyskać w prosty sposób:
column_names = Category.column_names.join(", ")
Category.find(:all, :select => "#{column_names}, count(...) as ..." ...)
Tak wyciągnięte obiekty mają wirtualny atrybut o podanej nazwie. Może nie jest to najładniejsze rozwiązanie, ale ActiveRecord raczej nie pozwala na zrobienie tego w przyjemniejszy sposób.