我正在做这样的事情:
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/