ohmsha/seven-databases-ja

p.61: Room.allではなくRoom.for_eachを使う

Closed this issue · 1 comments

第1刷p.61

ActiveRecordの例ではallではなくfor_eachを使う(原書p2.0での変更点)。

変更前:

# Construct a Hash to store room capacity count keyed by room style
capacity_by_style = {}
rooms = Room.all
for room in rooms
  total_count = capacity_by_style[room.style]
  capacity_by_style[room.style] = total_count.to_i + room.capacity
end

Room.all は、データベースに以下のようなSQL クエリを発行する。

SELECT * FROM rooms;

データベースは、すべての結果をアプリケーションサーバーに返す。

変更後:

# Construct a Hash to store room capacity count keyed by room style
capacity_by_style = {}
Room.find_each do |room|
  total_count = capacity_by_style[room.style]
  capacity_by_style[room.style] = total_count.to_i + room.capacity
end

Room.find_each は、データベースに以下のようなSQL クエリを発行する。

SELECT * FROM rooms LIMIT <batch_size> OFFSET <last_batch>;

データベースは、任意の数の結果をアプリケーションサーバーに返す。

第2刷で修正しました(r436)。