mysql - Rails - 如何从对象中获取随机记录?

标签 mysql ruby-on-rails ruby arrays random

我正在做这样的事情:

data = Model.where('something="something"')
random_data = data.rand(100..200)

返回:

NoMethodError (private method `rand' called for #<User::ActiveRecord_Relation:0x007fbab27d7ea8>):

一旦获得随机数据,我需要迭代该数据,如下所示:

random_data.each do |rd|
  ...

我知道有一种方法可以在MySQL中获取随机数据,但是我需要选择随机数据400次,所以我认为从数据库加载数据一次并选择随机数400次比运行更有效在MySQL上查询400次。

但是 - 如何消除该错误?

NoMethodError (private method `rand' called for #<User::ActiveRecord_Relation:0x007fbab27d7ea8>):

提前谢谢

最佳答案

我会将以下范围添加到模型中(取决于您使用的数据库):

# to model/model.rb
# 'RANDOM' works with postgresql and sqlite, whereas mysql uses 'RAND'
scope :random, -> { order('RAND()') } 

然后,以下查询将在一个查询中加载随机数量(200-400 范围内)的对象:

Model.random.limit(rand(200...400))

如果您确实想在 Rails 中而不是在数据库中执行此操作,请加载所有记录并使用 sample:

Model.all.sample(rand(200..400))

但是速度会比较慢(取决于数据库中的条目数量),因为 Rails 会从数据库加载所有记录并实例化它们,这可能会占用大量内存。

关于mysql - Rails - 如何从对象中获取随机记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28853957/

相关文章:

ruby-on-rails - 回形针不调整图像大小或创建样式目录

ruby - 这是 &&= 在 Ruby 中的合理用法吗?

mysql - 让我们看看你是否能解决这个问题,打开元素 hell

mysql - 选择将 X 连接到 Y 比将 Y 连接到 X 快十倍——这是为什么?

mysql - Rails 从管理仪表板给学生排名

ruby-on-rails - 接受嵌套属性和过滤器

ruby-on-rails - 查找使用 ActiveStorage 上传的文件的二进制文件

ruby - 将 HTTP 响应放入 Ruby on Rails 应用程序的哪个文件?

java - 从结果集中选择几行 mysql java

php - 以相同的响应时间向用户显示实时数据