我正在使用 Rails 4 和 Postgres 数据库。对于一个特定的表,我想以随机顺序向用户提供一堆表记录。此外,我不想一次显示所有数据,而是更喜欢通过它显示用户页面。因此,如果所有数据的随机顺序都有 ID
10, 8, 6, 4, 2, 9, 7, 5, 3, 1
我想要带有 ID 的数据
10, 8, 6, 4, 2
显示在第1页,id为9、7、5、3、1的数据显示在第2页(假设每页有5个结果)。如何编写以这种方式随机化数据的查找器方法,或者如何获取查找器方法的结果并随机化它们的顺序?请注意,初始记录组不会是表中的所有内容(它将是启用字段设置为 true 的所有内容)。
最佳答案
在 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()
会阻止这种情况。
关于ruby-on-rails - 如何随机化 Rails 查找器方法的结果排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286015/