Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql rails中随机记录的选择_Mysql_Ruby On Rails_Ruby_Controller - Fatal编程技术网

Mysql rails中随机记录的选择

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).

我试图从数据库中随机选择一条记录,并将其显示在我的视图中。问题是我不希望所选的随机记录重复,直到所有记录至少被选中一次。例如,假设我的表有10条记录,所以我想选择任意一条随机记录,并确保在至少选择一次其他9条记录之前,不会再次选择该随机选择的记录

片段:

    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()”)
如果该表相当大,则会点燃数据库服务器。。。或者你经常碰到这个问题。