質問
データマッパーでランダムデータセットを選択しようとしていますが、そのような関数サポートはないようです。
たとえば、データのセットがあります。
+-------------------+
| 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`
明らかに、必要に応じてこれをトランザクションに包みます。
私は通常、文字通りランダムレコードを取得することを気にしません。この場合、わずかに異なるパラダイムを使用します。
- 値で注文//
- n offset kを制限] kを選択します
ここで、KはコードでNN未満の乱数です。記録は注文に使用するものにいくらか隣接しているにもかかわらず、ほとんどの場合、ほとんどの場合はランダムです。
所属していません StackOverflow