質問

データマッパーでランダムデータセットを選択しようとしていますが、そのような関数サポートはないようです。

たとえば、データのセットがあります。

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

多くのデータがあり、100k以上の列があります。

そして、私はデータをオブジェクトにマップする必要があります:

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;
役に立ちましたか?

解決

乱数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)

ただし、プロパティを指定する必要があります。プロパティは、プロパティセットにマッピングするためです。

他のヒント

OPの長い時間ですが、これは「Datamapper Random Row」の最初のGoogleヒットです...

純粋なデータマッパーを使用し、継続的な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. n offset kを制限] kを選択します

ここで、KはコードでNN未満の乱数です。記録は注文に使用するものにいくらか隣接しているにもかかわらず、ほとんどの場合、ほとんどの場合はランダムです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top