ruby-on-rails - 如何随机化 Rails 查找器方法的结果排序?

标签 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页,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/

相关文章:

ruby 集不是唯一的

ruby-on-rails - Rails 仅在更改特定字段值时更新验证

sql - 在 Postgres 中搜索加密字段

SQL 替代使用 WHERE 作为子查询

mysql - JPA |循环遍历 ids 列表并更新 C

ruby-on-rails - Ruby:未初始化的未定义方法

ruby-on-rails - 如何使用 simple_form 和 bootstrap 生成 radio 内联标签?

javascript - 如何进行 Ajax update_attributes?

ruby-on-rails - Devise + Omniauth - 如何传递额外的参数?

ruby - 我数不清文件中使用了多少次相同的字符