La query che stai cercando dovrebbe assomigliare a questa:
SELECT user_id, min(created_at) AS min_created_at
FROM cards
WHERE company_id = 1
GROUP BY user_id
ORDER BY min(created_at)
Puoi entrare nella tabella user
se hai bisogno di colonne di quella tabella nel risultato, altrimenti non ne hai nemmeno bisogno per la query.
Se non hai bisogno di min_created_at
nel SELECT
lista, puoi semplicemente lasciarla via.
Dovrebbe essere facile da tradurre in Ruby (cosa in cui non sono bravo).
Per ottenere l'intero record utente (come deduco dal tuo commento):
SELECT u.*,
FROM user u
JOIN (
SELECT user_id, min(created_at) AS min_created_at
FROM cards
WHERE company_id = 1
GROUP BY user_id
) c ON u.id = c.user_id
ORDER BY min_created_at
Oppure:
SELECT u.*
FROM user u
JOIN cards c ON u.id = c.user_id
WHERE c.company_id = 1
GROUP BY u.id, u.col1, u.col2, .. -- You have to spell out all columns!
ORDER BY min(c.created_at)
Con PostgreSQL 9.1+ puoi semplicemente scrivere:
GROUP BY u.id
(come in MySQL) .. fornito id
è la chiave primaria.
Cito le note sulla versione :