我正在使用Rails 4和Postgres数据库。对于特定的表,我想向用户提供一堆表记录,但是以随机顺序。此外,我不想一次显示所有数据,而是希望用户页面通过它。因此,如果所有数据的随机顺序都有ID
10, 8, 6, 4, 2, 9, 7, 5, 3, 1
我希望ID为
的数据10, 8, 6, 4, 2
第1页上显示,第2页显示ID为9,7,5,3,1的数据(假设每页有5个结果)。如何编写一个finder方法,以这种方式随机化数据,或者如何获取finder方法的结果并随机化它们的顺序?请注意,初始记录组不会是表中的所有内容(它将是启用字段设置为true的所有内容)。
答案 0 :(得分:0)
在Postgres中,您可以使用order("random()")
随机化查询结果,例如
SomeModel.where(enabled: true).order("random()")
以随机顺序返回所有SomeModel
。
正如您可能在想的那样,如果您使用offset(0).limit(5)
作为第一页并再次使用offset(5).limit(5)
作为第二页,那么您将第二次获得不同的随机顺序分页是没有意义的。
我会通过缓存查询结果来解决这个问题。例如,使用Rails缓存:
results = Rails.cache.fetch("some_models/#{current_user.id}")
SomeModel.where(enabled: true).order("random()")
end
然后,您可以根据您所在的页面对结果进行切片。
由于所有这些都需要您将所有模型(或某些查询返回的所有模型)加载到内存中,因此您可以将它们随机存储在内存中:
results = Rails.cache.fetch("some_models/#{current_user.id}")
SomeModel.where(enabled: true).shuffle
end
这允许您的数据库缓存random()
阻止的基础查询结果。