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
这会返回id
个Person
个Views
个值的(有序!)数组,按照上一周收到的Person
id
个数的降序排列。
我的想法是,如果我可以将Person.find
这个数组传递给{{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中,而不是在查询中。