Mysql rails中随机记录的选择
我试图从数据库中随机选择一条记录,并将其显示在我的视图中。问题是我不希望所选的随机记录重复,直到所有记录至少被选中一次。例如,假设我的表有10条记录,所以我想选择任意一条随机记录,并确保在至少选择一次其他9条记录之前,不会再次选择该随机选择的记录 片段:Mysql rails中随机记录的选择,mysql,ruby-on-rails,ruby,controller,Mysql,Ruby On Rails,Ruby,Controller,我试图从数据库中随机选择一条记录,并将其显示在我的视图中。问题是我不希望所选的随机记录重复,直到所有记录至少被选中一次。例如,假设我的表有10条记录,所以我想选择任意一条随机记录,并确保在至少选择一次其他9条记录之前,不会再次选择该随机选择的记录 片段: offset = rand(Quote.count) @qotd = Rails.cache.fetch( "term", :expires_in => 6.seconds){ Quote.offset(offset).
offset = rand(Quote.count)
@qotd = Rails.cache.fetch( "term", :expires_in => 6.seconds){ Quote.offset(offset).first }
如果您需要跟踪使用情况,那么您需要的是某种序列列,用随机值填充该列,并在使用完后将其清空。当它们都为空时,用随机值重新设定种子,然后再重新执行。如果您需要跟踪使用情况,那么您需要的是某种序列列,用随机值填充该列,并在使用完后将其清空。当它们都为空时,使用随机值重新设定种子,然后重新进行此操作。您需要一个单独的位置来存储当前进程之外已显示的记录。该流程可能会消亡,或者您将运行多个流程(如果它是为了生产目的,那么肯定是这样) 与我不建议在数据库中存储序列相反,这将使添加新记录变得更加复杂 相反,我将添加一个简单的
显示的(布尔值)列(或单独的表),但要根据您的特定用例进行调整。因此,查询可能如下所示:
@qotd = Quote.where(displayed: false).order("RAND()").limit(1)
当然还有
@qotd.update_attribute :displayed, true
后来
如果未找到任何候选项,则必须重置所有记录的显示的列。所有这些(查询、更新和重置)都可能发生在单个方法中 您需要一个单独的位置来存储当前流程之外已经显示的记录。该流程可能会消亡,或者您将运行多个流程(如果它是为了生产目的,那么肯定是这样)
与我不建议在数据库中存储序列相反,这将使添加新记录变得更加复杂
相反,我将添加一个简单的显示的(布尔值)列(或单独的表),但要根据您的特定用例进行调整。因此,查询可能如下所示:
@qotd = Quote.where(displayed: false).order("RAND()").limit(1)
当然还有
@qotd.update_attribute :displayed, true
后来
如果未找到任何候选项,则必须重置所有记录的显示的列。所有这些(查询、更新和重置)都可能发生在单个方法中 我的建议是在表中添加一个类似“display\u count”的列。当您想要显示一个随机项时,只需发出如下查询:
quote = Quote.where(
display_count: Quote.select("MIN(display_count)")
).order("RANDOM()")
quote.update_attribute(:display_count, quote.display_count + 1)
这样,您总是选择一个显示最少的项目,并在检索该项目后将其递增。这应该(几乎)保证每次运行此代码时,都会得到一个新项。我的建议是在表中添加一个类似“display\u count”的列。当您想要显示一个随机项时,只需发出如下查询:
quote = Quote.where(
display_count: Quote.select("MIN(display_count)")
).order("RANDOM()")
quote.update_attribute(:display_count, quote.display_count + 1)
这样,您总是选择一个显示最少的项目,并在检索该项目后将其递增。这应该(几乎)保证每次运行此代码时,您都会得到一个新项目。order(“RAND()”)
将在数据库服务器上触发,如果该表相当大的话。。。或者您经常点击该查询。order(“RAND()”)
如果该表相当大,则会点燃数据库服务器。。。或者你经常碰到这个问题。