, has_one has_one.
, baz.foobar_id. , Foobar, Baz:
baz.id | baz.foobar_id
------ -------------
1 1
2 1
3 2
joins Foobar Baz:
Foobar.joins(:baz).count # This would be 3
, find_each join Foobar:
Foobar.joins(:baz).find_each(batch_size: 2) { |f| puts f.id }
# SELECT "foobar".* FROM "foobar" INNER JOIN "baz" ON... LIMIT 2
1
1
# SELECT "foobar".* FROM "foobar" INNER JOIN "baz" ON... WHERE ("foobar"."id" > 1) ... LIMIT 2
2
includes , Rails Foobar. , find_each :
Foobar.joins(:baz).includes(:baz).find_each(batch_size: 2) { |f| puts f.id }
1
find_each , , , :
break if ids.length < batch_limit
find_each 1000. 998 . , 998 Foobar, , find_each , . , 1000 Baz, 998 Foobar.
baz, , . - :
Baz.group(:foobar_id).having('count(*) > 1')
, has_one. , Foobar - :
Foobar.group(:id).joins(:baz).includes(:baz).count
Foobar.group(:id).joins(:baz).includes(:baz).find_each.count
Foobar.group(:id).joins(:baz).find_each.count