[英]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.