[英]Rails - how to fetch random records from an object?
我正在做这样的事情:
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次随机数据要比运行查询400次更为有效在MySQL上。
但是-如何摆脱这个错误?
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将从数据库中加载所有记录并实例化它们,这可能会占用大量内存。
使用data.sample(rand(100..200))
了解为什么rand无法正常工作的更多信息,请在此处阅读https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4555
与数据库无关的另一种方法是:
def self.random_record
self.where('something = ? and id = ?', "something", rand(self.count))
end
这里唯一的事情是-正在执行2个查询 。 self.count
在做一个查询- SELECT COUNT(*) FROM models
,另一个是您要获取随机记录的实际查询。
好吧,现在假设您想要n
随机记录。 然后像这样写:
def self.random_records n
records = self.count
rand_ids = Array.new(n) { rand(records) }
self.where('something = ? and id IN (?)',
"something", rand_ids )
end
这实际上取决于您要为此优化付出多少努力,因为有不止一种解决方案。 这是2个选项。
简单的方法是使用ORDER BY RAND() LIMIT 400
随机选择400个项目。
或者,只需选择月球下的所有内容,然后使用Ruby从总结果集中随机选择400个,例如:
data = Model.where(something: 'something').all # all is necessary to exec query
400.times do
data.sample # returns a random model
end
我不推荐第二种方法,但是它应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.