簡體   English   中英

Rails-如何從對象獲取隨機記錄?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM