回答編集履歴

1

追記

2018/10/11 10:16

投稿

takahashim
takahashim

スコア1877

test CHANGED
@@ -9,3 +9,85 @@
9
9
 
10
10
 
11
11
  * [Rails: pluckでメモリを大幅に節約する(翻訳)](https://techracho.bpsinc.jp/hachi8833/2018_09_26/62333)
12
+
13
+
14
+
15
+ -----
16
+
17
+ (追記)
18
+
19
+
20
+
21
+ あああー、これはぜんぜん違う話でしたね。
22
+
23
+
24
+
25
+ ```ruby
26
+
27
+ items = Item.all
28
+
29
+ ```
30
+
31
+
32
+
33
+ がダメです。allはNGです。
34
+
35
+ RailsガイドのActive Record クエリインターフェイスの[1.2 複数のオブジェクトをバッチで取り出す](https://railsguides.jp/active_record_querying.html#%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E3%83%90%E3%83%83%E3%83%81%E3%81%A7%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99)に書かれている、「# このコードはテーブルが大きい場合、メモリを大量に消費する可能性あり」の例そのものになってます。
36
+
37
+
38
+
39
+ recordsを渡すのではなく、
40
+
41
+
42
+
43
+ ```
44
+
45
+ def index
46
+
47
+ render_csv
48
+
49
+ end
50
+
51
+ ```
52
+
53
+
54
+
55
+ みたいにしておいて、
56
+
57
+
58
+
59
+ ```ruby
60
+
61
+ def render_csv
62
+
63
+ ## (略)
64
+
65
+ self.response_body = Enumerator.new do |y|
66
+
67
+ names = Item.csv_column_names
68
+
69
+ y << encode_sjis(names.values.to_csv)
70
+
71
+
72
+
73
+ Item.find_in_batches do |group|
74
+
75
+ group.each do |record|
76
+
77
+ values = record.csv_column_values
78
+
79
+ y << encode_sjis(values.map{|k, v| v.call(record)}.to_csv)
80
+
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ ```
90
+
91
+
92
+
93
+ というように、`find_in_batches`で初めてオブジェクトを生成するようにしないと、`find_in_batches`とかを使うメリットがないです。