Skip to content

Commit d994430

Browse files
committed
preserve order when generating CSV
1 parent 6d2eece commit d994430

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

lib/rails_admin/support/csv_converter.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,22 @@ def export_field_for(method, model_config = @model_config)
7171

7272
def generate_csv_string(options)
7373
generator_options = (options[:generator] || {}).symbolize_keys.delete_if { |_, value| value.blank? }
74-
method = @objects.respond_to?(:find_each) ? :find_each : :each
7574

7675
CSV.generate(**generator_options) do |csv|
7776
csv << generate_csv_header unless options[:skip_header]
7877

79-
@objects.send(method) do |object|
80-
csv << generate_csv_row(object)
78+
if @objects.respond_to?(:page)
79+
page_num = 1
80+
batch = @objects.page(page_num)
81+
while batch.any?
82+
batch.each { |object| csv << generate_csv_row(object) }
83+
page_num += 1
84+
batch = @objects.page(page_num)
85+
end
86+
else
87+
@objects.each do |object|
88+
csv << generate_csv_row(object)
89+
end
8190
end
8291
end
8392
end

spec/rails_admin/support/csv_converter_spec.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,5 +151,32 @@
151151
expect(subject[2]).to eq("\n")
152152
end
153153
end
154+
155+
context 'when more than one page of objects' do
156+
before do
157+
FactoryBot.create_list :player, 100
158+
end
159+
160+
let(:objects) { Player.all }
161+
let(:options) { {} }
162+
163+
it 'generates a csv with all objects' do
164+
expect(subject[2].split("\n").count).to be 101
165+
end
166+
end
167+
168+
context 'when objects are ordered' do
169+
before do
170+
FactoryBot.create_list :player, 30
171+
FactoryBot.create :player, name: 'Player zzz'
172+
end
173+
174+
let(:objects) { Player.all.order('name desc') }
175+
let(:options) { {} }
176+
177+
it 'preserves the ordering' do
178+
expect(subject[2].split("\n")[1]).to include('Player zzz')
179+
end
180+
end
154181
end
155182
end

0 commit comments

Comments
 (0)