我有一个 Rails 引擎,它在所选模型上定义了一个类方法top(count)
。此方法的作用是count
从 Redis 中的排序集 (ZSET) 中获取 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
从记录数组构造一个?