2010-10-26 4 views
0

J'ai un tableau de ids des objets que je veux obtenir de la base de données, mais PostGreSQL les retourne triés par ids:Trouver un tableau de ids tout en gardant l'ordre avec Rails et PostGreSQL

Users.find([4, 1, 3]) 
=> [User 1, User 3, User 4] 

Je sais Je pouvais les trier en arrière comme ceci:

ids = [4, 3, 1] 
r = Users.find(ids) 
users = ids.map{|id| r.detect{|each| each.id == id}} 

Mais serait-il pas mieux si je pouvais le faire avec la base de données? Je sais que MySQL a une option "field". Est-ce que PostGreSQL a quelque chose d'équivalent?

Merci,

Kevin

+1

Pour votre information, PostgreSQL ne « Retournés trié par ids ". Soit votre ORM le triera, soit il reviendra juste dans cet ordre. Un choix non ordonné de la base de données n'est pas garanti pour revenir dans n'importe quel ordre et en supposant que cela conduise finalement à un comportement étrange. –

Répondre

2

Cette fonction simule celle de MySQL

CREATE OR REPLACE FUNCTION field(anyelement, anyarray) RETURNS integer AS 
$body$ 
    SELECT COALESCE((
    SELECT i 
    FROM generate_series(array_lower($2, 1), array_upper($2, 1)) s(i) 
    WHERE $2[i] = $1 
),0); 
$body$ LANGUAGE SQL STABLE; 

Exemple d'utilisation:

CREATE TABLE x (id integer); 
INSERT INTO x (1),(2),(3); 
SELECT * FROM x ORDER BY field(id, ARRAY[3,1,2]); 
id 
---- 
    3 
    1 
    2 
(3 rows) 
Questions connexes