Skip to content

Commit 4e2e719

Browse files
committed
fix
1 parent 298f475 commit 4e2e719

File tree

5 files changed

+59
-5
lines changed

5 files changed

+59
-5
lines changed

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: .
33
specs:
4-
umbrellio-utils (1.7.1)
4+
umbrellio-utils (1.8.1)
55
memery (~> 1)
66

77
GEM

lib/umbrellio_utils/database.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,15 @@ def get_violated_constraint_name(exception)
2525

2626
def each_record(dataset, primary_key: nil, **options, &block)
2727
primary_key = primary_key_from(dataset, primary_key:)
28+
eager_tables = Array(options.delete(:eager_load))
2829

2930
with_temp_table(dataset, primary_key:, **options) do |ids|
3031
rows = ids.map { |id| row(id.is_a?(Hash) ? id.values : [id]) }
31-
dataset.model.where(row(primary_key) => rows).reverse(row(primary_key)).each(&block)
32+
records = dataset.model
33+
.eager(eager_tables)
34+
.where(row(primary_key) => rows)
35+
.reverse(row(primary_key)).all
36+
records.each(&block)
3237
end
3338
end
3439

lib/umbrellio_utils/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module UmbrellioUtils
4-
VERSION = "1.7.1"
4+
VERSION = "1.8.1"
55
end

spec/support/database.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
begin
66
db_name = "umbrellio_utils_test"
7-
DB = Sequel.connect(ENV.fetch("DB_URL", "postgres://localhost/#{db_name}"))
7+
DB = Sequel.connect(ENV.fetch("DB_URL", "postgres:///#{db_name}"))
88
rescue Sequel::DatabaseConnectionError => error
99
puts error
1010
abort "You probably need to create a test database. " \
@@ -17,7 +17,7 @@
1717

1818
DB.extension :batches
1919

20-
DB.drop_table? :users
20+
DB.drop_table? :users, cascade: true
2121
DB.create_table :users do
2222
primary_key :id
2323
column :email, :text
@@ -37,6 +37,12 @@
3737
primary_key %i[geo nick]
3838
end
3939

40+
DB.drop_table? :user_tokens
41+
DB.create_table :user_tokens do
42+
primary_key :id
43+
foreign_key :user_id, :users
44+
end
45+
4046
class User < Sequel::Model(:users)
4147
def skip_table_sync?
4248
false
@@ -54,3 +60,11 @@ def skip_table_sync?
5460
false
5561
end
5662
end
63+
64+
class UserToken < Sequel::Model(:user_tokens)
65+
many_to_one :user , class: "User", key: :user_id
66+
67+
def skip_table_sync?
68+
false
69+
end
70+
end

spec/umbrellio_utils/database_spec.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
describe "#each_record" do
3030
before do
31+
p 123
3132
User.multi_insert(users_data)
3233
allow(Kernel).to receive(:sleep) { |value| sleep_calls << value }
3334
end
@@ -176,5 +177,39 @@
176177
expect(result_emails).to eq(reversed_emails)
177178
end
178179
end
180+
181+
context "with eager_load" do
182+
let(:options) { Hash[eager_load: [:user]] }
183+
184+
let(:tokens_data) { Array.new(10) { |index| Hash[user_id: index + 1] } }
185+
186+
let!(:db_logger) do
187+
DB.logger = Class.new(Logger) do
188+
attr_accessor :queries
189+
190+
def add(_, _, msg)
191+
self.queries ||= []
192+
queries << msg if msg.match?(/FROM "users"/)
193+
end
194+
end.new(nil)
195+
end
196+
197+
subject(:result_users) do
198+
tokens = []
199+
200+
described_class.each_record(UserToken.dataset, **options) do |token|
201+
tokens << token
202+
end
203+
204+
tokens.map(&:user)
205+
end
206+
207+
before { UserToken.multi_insert(tokens_data) }
208+
209+
it "preloads users" do
210+
expect(result_users.map(&:id)).to eq([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
211+
expect(db_logger.queries.size).to eq(1)
212+
end
213+
end
179214
end
180215
end

0 commit comments

Comments
 (0)