Найдите каждые 50 000, затем следующие 50 000 и т. Д. И сохраните их в разных файлах. - PullRequest
0 голосов
/ 02 мая 2011

У меня есть следующий файл Rake. Использование RoR 2.3.8.

desc "Create shops sitemap"
task(:shops => :environment) do
  sitemap = Sitemap.new
  #add every item
  for i in shop.find(:all, :select => 'id, updated_at', :order => 'updated_at DESC', :limit => 50000)
    sitemap.add_url("http://abc.com/shops/#{i.id}",w3c_date(i.updated_at),'daily','1.0')
  end

  puts "#{sitemap.urls.length} total urls"
  #delete the file
  FileUtils.rm(File.join(RAILS_ROOT, "public/sitemap_shops_1.xml.gz"), :force => true)

  f =File.new(File.join(RAILS_ROOT, "public/sitemap_shops_1.xml"), 'w')

  sitemap.write(f,2)
  f.close

  system("gzip #{File.join(RAILS_ROOT, 'public/sitemap_shops_1.xml')}")
end

Файл выше ищет первые 50 000 записей на основе последних обновлений, а затем сохраняет их в файле с номером 1.

Как изменить код, чтобы он выполнял поиск в следующих 50 000, и сохранял файл с номером 2, затем следующие 50 000, сохранял как файл с номером 3 и т. Д.

Спасибо.

1 Ответ

2 голосов
/ 02 мая 2011

Вместо find вы можете использовать find_in_batches, который будет возвращать группы по 1000 за раз (но вы можете переопределить это значение на 50 000 с помощью опции :batch_size).Добавьте переменную-счетчик (поскольку я не думаю, что find_in_batches имеет что-то вроде each_with_index), и вы можете обрабатывать все нужные вам файлы.

desc "Create shops sitemap"
task(:shops => :environment) do
  file_name_index = 0
  Shop.find_in_batches(:all, :select => 'id, updated_at', :order => 'updated_at DESC', :batch_size => 50000) do |group_of_50000|
    file_name_index += 1
    sitemap = Sitemap.new
    #add every item
    for i in group_of_50000
      sitemap.add_url("http://abc.com/shops/#{i.id}",w3c_date(i.updated_at),'daily','1.0')
    end

    puts "#{sitemap.urls.length} total urls"
    #delete the file
    FileUtils.rm(File.join(RAILS_ROOT, "public/sitemap_shops_#{file_name_index}.xml.gz"), :force => true)

    f =File.new(File.join(RAILS_ROOT, "public/sitemap_shops_#{file_name_index}.xml"), 'w')

    sitemap.write(f,2)
    f.close

    system("gzip #{File.join(RAILS_ROOT, 'public/sitemap_shops_#{file_name_index}.xml')}")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...