Ruby on rails Rails唯一随机记录

Ruby on rails Rails唯一随机记录,ruby-on-rails,random,Ruby On Rails,Random,我想随机显示几条记录。我尝试的第一件事是: thing1 = Thing.offset(rand(Thing.count)).first thing2 = Thing.offset(rand(Thing.count)).first 但这有时显然会返回重复的结果。我想很多唱片没什么问题,但现在我很好奇。所以我试了一下: random1 = rand(count) random2 = rand(count) until random1!=random2 do random2 = rand(co

我想随机显示几条记录。我尝试的第一件事是:

thing1 = Thing.offset(rand(Thing.count)).first
thing2 = Thing.offset(rand(Thing.count)).first
但这有时显然会返回重复的结果。我想很多唱片没什么问题,但现在我很好奇。所以我试了一下:

random1 = rand(count)
random2 = rand(count)
until random1!=random2 do
  random2 = rand(count)
end
thing1 = Thing.offset(random1).first
thing2 = Thing..offset(random2)).first
但这也不是完美的,如果你得到,比如说,4和5作为你的随机数,记录4被删除了,你仍然会得到一个重复的,因为偏移量。另外,这是吹毛求疵,在这个“随机”选择中,直接在n条删除记录之后出现的记录是(n+1)倍


获取多个唯一随机记录的最佳方法是什么

如果同时拾取记录,则无法保证唯一性。如果您需要记录是唯一的,则必须随机选择一条记录,然后将其从记录集中排除,随机选择另一条记录,等等。此问题应使用递归轻松实现。

如果始终是两条记录,您可以简单地使用:

(thing1, thing2) = Thing.order("RANDOM()").limit(2)
要概括任意数量的记录,您可以为其创建一个函数:

class Thing < ActiveRecord::Base
  def self.random_n_record(n)
    order("RANDOM()").limit(n)
  end
end
注意:如果您使用的是Mysql,请将
“RANDOM()”
替换为
“RAND()”
<代码>“RANDOM()”用于Postgresql

count = Thing.count
thing1 = Thing.offset(rand(count)).first
thing2 = Thing.offset(rand(count)).first
until thing1.id != thing2.id do
  thing2 = Thing.offset(rand(count)).first
end

明白了。

可能是@Two Negatives的副本不。接近,不同。SQL相关。这不是只返回有序的东西吗?记录4,记录5,等等?我想你可能是对的。不管怎样,我更新了我的答案,使用数据库中的随机排序。啊,应该可以了。不过,这将是一个相当缓慢的查询,不是吗?我想知道我应该用谁的解决方案。好问题。我不确定。您可以对它们进行测试,看看哪一个更适合您的用例。在一个巨大的数据库上,你的解决方案可能会更快,因为在ruby中找到一个随机数最多两到三倍(实际上)可能比随机排序数千或数百万行要快。是的,我想至少有几千行。无论如何,谢谢你的帮助。还有一个很棒的网站,可能是我在互联网上见过的最棒的东西。我曾经看到一个人用绑在胡子上的斧头砍倒了一棵树。如果你只有一条记录,你的循环不会终止,所以你可能需要加一个检查计数是否为一。
count = Thing.count
thing1 = Thing.offset(rand(count)).first
thing2 = Thing.offset(rand(count)).first
until thing1.id != thing2.id do
  thing2 = Thing.offset(rand(count)).first
end