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

标签 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

最佳答案

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

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

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

PS:确保您的 order 变量已清理!

关于ruby-on-rails - 如何从按 ID 的特定顺序排序的记录数组中获取 ActiveRecord::Relation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11236339/

相关文章:

ruby-on-rails - 一次渲染 n 个对象,插入代码然后重复接下来的 n 个对象 - Rails

ruby-on-rails - 加载错误 : cannot load such file -- capistrano/rbenv

ruby-on-rails - 需要 LRU 缓存时,Memcached 与 Redis 作为 Rails.cache

ruby-on-rails - gem install rails 不安装rails

ruby-on-rails - rails : Returning errors from Module to Rake task?

带有 mod_ruby 的 Apache 上的 Ruby

css - 如何从数据库中获取属性值并应用于表单

ruby-on-rails - Rails 4/Devise 3.00rc/pg "Unpermitted parameters"在注册/编辑

ruby-on-rails - Ruby 更新后 Rails 3.1rc4 Assets 管道中断?如何重新激活/配置它?

mysql - 从两个表中获取数据