使用DataMapper选择随机数据

时间:2009-06-12 18:45:27

标签: mysql ruby datamapper

我试图用DataMapper选择随机数据集,但似乎没有这样的功能支持。

例如,我有一组数据:

+-------------------+
| ID | Name | Value |
+-------------------+
| 1  | T1   | 123   |
| 2  | T2   | 456   |
| 3  | T3   | 789   |
| 4  | T4   | 101   |
| ----------------- |
| N  | Tn   | value |

可能有很多数据,超过10万行。

我需要将数据映射到对象:

class Item
  include DataMapper::Resource
  property :id, Serial
  property :name, String
  property :value, String
end

所以,问题是:如何从表中选择随机数据?

SQL中的类似查询将是:

SELECT id, name, value FROM table ORDER BY RAND() LIMIT n;

3 个答案:

答案 0 :(得分:6)

OP之后的很长一段时间,但由于这是第一次google点击“datamapper random row”......

使用纯DataMapper,无需对连续ID等进行假设,您可以这样做:

Item.first(:offset => rand(Item.count))

导致查询:

SELECT COUNT(*) FROM `items`
SELECT <fields> FROM `items` ORDER BY `id` LIMIT 1 OFFSET <n>

如果您更喜欢单个查询,可能会降低速度,您可以这样做:

Item.all.sample

结果:

SELECT <fields> FROM `items` ORDER BY `id`

显然,如果需要,请将其包装在事务中。

答案 1 :(得分:2)

我一般不关心字面上检索随机记录。在这种情况下,我使用了略微不同的范例。

  1. ORDER BY值//或值mod某个数字//您还可以使用名称或名称上的某个函数
  2. SELECT LIMIT n OFFSET k
  3. 其中k是代码中生成的小于N-n的随机数。在大多数情况下都是足够随机的,即使这些记录在您用于ORDER BY的内容中有些连续。

答案 2 :(得分:1)

您可以生成随机数x&lt; number_of_rows,只需获取该ID。

您也可以尝试直接输入SQL,如下所示:

find_by_sql(<<-SQL
    SELECT `id`, `name`, `value` FROM table ORDER BY RAND() LIMIT n;
SQL, :properties => property_set)

您需要指定:属性,以便与您的属性集进行映射。