如何从按其ID的特定顺序排序的记录数组中获取ActiveRecord :: Relation?

时间:2012-06-27 23:52:11

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一个Rails引擎,它在所选模型上定义类方法top(count)。此方法的作用是从Redis中的有序集(ZSET)中获取count个ID。这个想法是这个模型的每个项目都有一个分数,这个方法是返回“最佳”记录。该方法基本上如下所示:

def self.top(count = 1)
  ids = redis.zrevrange(self.score_set, 0, count - 1)
  items = self.find ids

  if count == 1
    return items.first
  else
    return items.sort { |x, y| ids.index(x.id) <=> ids.index(y.id) }
  end
end

正如您所看到的,我目前正在对记录进行排序,因为数据库(或适配器)在通过多个ID查找时往往不会保持顺序。例如,Model.where('ID IN (?)', ids)将按升序ID排序,而不是按照传递的ID的顺序排序。

对项目进行排序会返回Array,但我希望此方法返回ActiveRecord::Relation,以便我的用户可以使用其他ActiveRecord查询方法对其进行链接。有没有办法可以使用内置的ActiveRecord查询方法来维护我的ID数组的顺序?或者,有没有办法从记录数组构建ActiveRecord::Relation

1 个答案:

答案 0 :(得分:4)

这实际上取决于您使用的基础数据库。我不认为rails有一个很好的方法来做到这一点。

我有一个应用程序,我在做同样的事情。在Redis ZSET中存储ID,然后需要按顺序获取它们。由于我们使用的是MySql,我们可以利用field function

Model.where('id in (?)', ids).order("field(id, #{order})")

PS:确保您的order变量已经过消毒!