0

问题的简单陈述:

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).

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

感觉应该有一种方法可以传入一个数组idPerson以相同的顺序返回一个对象数组......

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

实际上,我更一般地想做的是找到Person给定时间段内“观看次数最多”的对象。

这是我所拥有的:

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

这将返回一个(有序!)对象id值数组,按上周收到的每个Person对象的数量降序排列。ViewsPerson

我的想法是,如果我可以将这个ids 数组传递给Person.find方法,那么我就自由了!但也许还有另一种方法可以更轻松地完成它。我对所有想法持开放态度。

谢谢!

4

1 回答 1

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​​ 中发生的,而不是在查询中。

于 2013-08-30T00:30:52.657 回答