2

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;
4

3 に答える 3

6

OPからずいぶん経ちましたが、これが「datamapper random row」の最初のGoogleヒットなので...

純粋な 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`

明らかに、必要に応じてこれをトランザクションにラップします。

于 2012-01-29T02:20:18.593 に答える
2

私は通常、文字通りランダムなレコードを取得することを気にしません。この場合、少し異なるパラダイムを使用します。

  1. ORDER BY 値 // または value mod some number // 名前または名前に関数を使用することもできます
  2. SELECT LIMIT n オフセット k

ここで、k はコードで生成された Nn 未満の乱数です。ORDER BY に使用するレコードはある程度連続していますが、ほとんどの場合、十分にランダムです。

于 2009-06-12T20:22:32.777 に答える
1

乱数 x < number_of_rows を生成し、その ID を取得するだけです。

次のように、SQL を直接入力することもできます。

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

ただし、プロパティ セットにマップするには、:properties を指定する必要があります。

于 2009-06-12T18:58:11.793 に答える