将依赖于顺序的数组传递给ActiveRecord的find()方法

时间:2013-08-29 23:55:31

标签: mysql ruby-on-rails arrays activerecord

简单说明问题:

ActiveRecord文档显示您可以将多个值传递到对象find()方法,如下所示:

Person.find(1, 2, 6) # returns an array for objects with IDs in (1, 2, 6)

我的问题是返回的对象不敏感到你传入的值的顺序。

例如,Person.find(1, 2, 6)返回与Person.find(6, 1, 2)完全相同的内容。

有没有办法让这种搜索顺序敏感

感觉应该有一种传递id数组并以相同顺序获取Person个数组的方法......

更广泛的背景,对于有兴趣阅读的人:

我想要更普遍地做的事情是找到给定时间段内“观看次数最多的”Person个对象。

这就是我所拥有的:

@most_viewed = View.where('created_at < ?', Time.now - 1.week).group(:person_id).order('count_person_id desc').count('person_id').keys

这会返回idPersonViews个值的(有序!)数组,按照上一周收到的Person id个数的降序排列。

我的想法是,如果我可以将Person.find这个数组传递给{{1}}方法,那么我就可以免费回家!但也许还有另一种方法可以更容易地做到这一点。我对所有的想法持开放态度。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以返回ids本身,而不是从查询中返回views

@most_viewed = View.where('created_at < ?', Time.now - 1.week)
  .group(:person_id).order('count_person_id desc').includes(:person)

现在您已经订购了人员,但您只需通过@most_viewed变量访问它们。

@most_viewed.each do |view|
  # do something with view.person
end

修改

如果上述解决方案不适合您,您可以这样订购人员

Person.find([6, 1, 2]).index_by(&:id).slice(*[6, 1, 2]).values

但顺序发生在ruby中,而不是在查询中。