在使用Rails和PostGreSQL保持顺序的同时查找id数组

时间:2010-10-26 06:43:59

标签: ruby-on-rails postgresql activerecord

我想从数据库中获取一组id对象,但PostGreSQL按ids排序返回它们:

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

我知道我可以像这样对它们进行排序:

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

但如果我能用数据库做这件事会不会更好?我知道MySQL有一个“字段”选项。 PostGreSQL有相同的东西吗?

谢谢,

凯文

1 个答案:

答案 0 :(得分:2)

此函数将模拟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;

使用示例:

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)