如何随机化Rails finder方法的结果排序?

时间:2016-05-17 20:50:21

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 random

我正在使用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的所有内容)。

1 个答案:

答案 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()阻止的基础查询结果。