Как получить список (идентификаторов) сгруппированных записей с помощью Rails + MySQL?

Я могу группировать записи по количеству сгруппированных записей следующим образом:

@cars = Car.group(:manufacturer).select("id, manufacturer, COUNT(id) AS total_count)

И результат будет примерно таким:

Porsche - 5
Renault - 3
Mercedes - 1
Audi - 2

Сейчас я пытаюсь выяснить, как получить список сгруппированных записей (их идентификаторов) - как и в случае с Porsche, я хотел бы узнать 5 сгруппированных автомобилей (их идентификаторы). Есть ли способ сделать это - в идеале с использованием MySQL (в отрывке select)?


person user984621    schedule 18.12.2014    source источник


Ответы (1)


Один из способов - использовать _1 _ который, цитируя документы, «возвращает строковый результат с объединенными не NULL значениями из группы». Это будет примерно так:

@cars = Car.group(:manufacturer)
          .select("id, manufacturer, COUNT(id) AS total_count, GROUP_CONCAT(id) AS car_ids")

@cars.first.car_ids # => "1,2,5,9"
@cars.first.car_ids.split(',') # => [ "1", "2", "5", "9" ]

Однако я должен предупредить, что использование manufacturer в качестве текстового атрибута Car довольно быстро станет головной болью. Вам будет лучше с моделью производителя, которая has_many :cars. Это позволит вам делать гораздо более умные запросы, например Manufacturer.includes(:cars).all. Вот почему мы в первую очередь используем реляционные базы данных.

person Jordan Running    schedule 18.12.2014
comment
Спасибо, @Jordan, GROUP_CONTACT, похоже, делает именно то, что мне нужно! Говоря о manufacturer-вещи; да, я думаю об этом и знаю об этом, мне нужно было изменить это таким образом. - person user984621; 19.12.2014