簡體   English   中英

在Rails中選擇隨機記錄

[英]Selecting random record in rails

我試圖從數據庫中隨機選擇一條記錄,並在我的視圖中顯示它。 要注意的是,我不希望所選的隨機記錄重復進行,直到所有記錄都至少被選中一次為止。 例如,假設我的表有10條記錄,因此我想選擇一個隨機記錄,並確保在至少選擇了另外9條記錄之前,不會再次選擇該隨機選擇的記錄。

片段:

    offset = rand(Quote.count)

    @qotd = Rails.cache.fetch( "term", :expires_in => 6.seconds){ Quote.offset(offset).first }

如果您需要跟蹤使用情況,那么您需要的是某種序列列,在其中填充隨機值,並在用完它們時將它們清空為NULL。 當它們全部為NULL時,請使用隨機值重新設置種子,然后重新進行。

您將需要一個單獨的位置來存儲當前流程之外已經顯示的記錄。 該過程可能會終止,或者您將運行多個過程(如果是出於生產目的,那么肯定是這種情況)。

tadman提出的相反,我不建議將序列存儲在db中,因為這會使添加新記錄更加復雜。

取而代之的是,我將添加一個簡單的displayed (布爾)列(或單獨的表),並依賴於其他線程中提出的內容,但會根據您的特定用例進行改進。 因此查詢可能是這樣的:

@qotd = Quote.where(displayed: false).order("RAND()").limit(1)

當然是

@qotd.update_attribute :displayed, true

稍后的。

如果找不到候選者,則必須重置所有記錄的displayed列。 所有這些(查詢,更新和重置)可能應該在一種方法中發生。

我的建議是在表中添加一列“ display_count”。 當您想要顯示隨機項目時,只需發出如下查詢:

quote = Quote.where(
  display_count: Quote.select("MIN(display_count)")
  ).order("RANDOM()")
quote.update_attribute(:display_count, quote.display_count + 1)

這樣,您始終會選擇顯示最少的項目,並在檢索后將其遞增。 那應該(幾乎)保證每次運行此代碼時,您都會得到一個新項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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