[RUBY] Wählen Sie zufällig 100 Datensätze aus der Datenbank aus

Als ich bestimmte Daten gespeichert habe, wollte ich 100 Benutzer zufällig mit diesen Daten verknüpfen.

Erstellen Sie zur Vorbereitung eine neue Tabelle, um die "Tabelle, die gespeicherte Daten verwaltet" und die "Tabelle, die Benutzer verwaltet" zu verknüpfen. Details werden später erklärt.

Rufen Sie zunächst in der Methode, mit der die Originaldaten gespeichert werden, die vom Benutzer ausgewählte Methode auf.

if @item.save
      destination_select()

Als nächstes schreiben wir eine Methode zur Auswahl von Benutzern.

Als Politik

① Bereiten Sie ein leeres Array vor (2) Ermitteln Sie die Benutzer-ID mithilfe der Rand-Funktion nach dem Zufallsprinzip ③ Wenn die erfasste ID nicht im Array enthalten ist, speichern Sie sie zusätzlich zum Array. ④ Wenn es enthalten ist, wiederholen Sie die Rand-Funktion </ b>

Es wird sein.

Schauen wir uns jeden an.

① Bereiten Sie ein leeres Array vor </ b>

def destination_select
    user_ids = []                             
  end

② Benutzer-ID mit der Rand-Funktion </ b> zufällig abrufen Der Bereich wird mit der Anzahl der Datensätze im Benutzermodell als Argument der Rand-Funktion festgelegt. Auch dieses Mal möchte ich 10 Leute bekommen, also wiederhole ich dies 10 Mal mit der Zeitmethode.

 def destination_select
    user_ids = []
    100.times do |i|
      user_id = (rand(User.count))
    end
  end

③ Wenn die erfasste ID nicht im Array enthalten ist, speichern Sie sie zusätzlich zum Array Die erhaltene ID wird in das Array user_ids verschoben. Auch in der hier im Voraus vorbereiteten "Tabelle zum Verknüpfen" Speichern Sie den Datensatz mit der vom Aufrufer definierten ID von @item und der von der Rand-Funktion erhaltenen Benutzer-ID als Argumente.
 def destination_select
    user_ids = []
    100.times do |i|
      user_id = (rand(User.count))
      #Beschreiben Sie hier den bedingten Ausdruck von ④
      user_ids.push(user_id)
      Destination.create(item_id: @item.id, user_id: user_id)
    end
  end

④ Wenn es enthalten ist, wiederholen Sie die Rand-Funktion Wenn dies unverändert bleibt, kann die Benutzer-ID aufgrund der Rand-Funktion dupliziert werden. Daher wird beurteilt, ob sich die von der include-Methode erfasste ID nicht mit der bisher erfassten und im Array vermerkten ID überschneidet, und die Rand-Funktion wird wiederholt, bis keine Duplizierung mehr vorliegt.
 def destination_select
    user_ids = []
    100.times do |i|
      user_id = (rand(User.count))
      while user_ids.include?(user_id) do
        user_id = (rand(User.count)) 
      end
      user_ids.push(user_id)
      Destination.create(item_id: @item.id, user_id: user_id)
    end
  end

Dies ist abgeschlossen.

6
8
42
85
93
75
5
40
79
23
17
13
88
74
54
62
64
26
35
70
14
49
63
28
81
98
69
94
0
91
87
55
84
83
9
36
80
78
30
12
3
92
20
24
2
67
34
43
16
95
86
38
22
77
97
11
25
21
90
1
51
65
53
68
37
58
56
47
18
15
41
29
89
59
52
44
46
48
82
57
10
50
45
60
66
7
32
76
4
19
27
61
96
39
71
72
33
31
99
73

Ich konnte die IDs nach dem Zufallsprinzip für 100 Personen ohne Duplizierung abrufen und speichern.

Nachtrag

Wie Sie in den Kommentaren ausgeführt haben, möchte ich zwei Punkte hinzufügen.
(1) In dem obigen Fall ist 0 aufgrund der Art der Rand-Funktion enthalten. Da die Benutzer-ID 0 nicht vorhanden ist, muss +1 hinzugefügt werden. </ b>

(2) Als Verfahren zur zufälligen Erfassung ist das Folgende eine schnellere Verarbeitungsgeschwindigkeit und eine einfachere Beschreibung. </ b>

User.order("random()").limit(100).pluck(:id) # sqlite/pg
User.order("rand()").limit(100).pluck(:id) # mysql
user_ids = User.order("random()").limit(100).pluck(:id)
user_ids.each{|user_id| Destination.create(item_id: @item.id, user_id: user_id) }

Vielen Dank für den Hinweis.