Выберите случайные данные с помощью DataMapper - PullRequest
2 голосов
/ 12 июня 2009

Я пытаюсь выбрать случайные наборы данных с помощью DataMapper, но похоже, что такая функция не поддерживается.

Например, у меня есть набор данных:

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

Может быть много данных, более 100 тыс. Строк.

И мне нужно сопоставить данные с объектом:

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 ]

6 голосов
/ 29 января 2012

Долгое время после ОП, но так как это первое попадание Google в "случайный ряд datamapper" ...

Используя чистый DataMapper и не делая предположений о непрерывных идентификаторах и т. Д., Вы можете сделать:

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`

Очевидно, оберните это в транзакцию, если вам нужно.

2 голосов
/ 13 июня 2009

Мне вообще все равно, буквально извлекать случайные записи. В этом случае я использую немного другую парадигму.

  1. ORDER BY value // или значение mod для некоторого числа // вы также можете использовать имя или некоторую функцию для имени
  2. ВЫБЕРИТЕ ЛИМИТ n СМЕЩЕНИЕ k

где k - случайное число, сгенерированное в вашем коде меньше, чем N-n. В большинстве случаев достаточно случайны, хотя записи несколько соприкасаются в том, что вы используете для ORDER BY.

1 голос
/ 12 июня 2009

Вы можете сгенерировать случайное число x

Вы также можете попробовать ввести SQL напрямую, например:

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

Вам нужно указать: свойства, хотя, чтобы он отображался с вашим набором свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...