外部APIから大量のXMLデータを取得しています。
1ページあたり20レコードのページ付けされたすべてのデータが得られます。
また、各ドキュメントの合計レコード数もわかります。
XML(実際にはplist data)をgemで取得し、Typhoeus
gemで変換してPlist
、データベースに挿入しています。
問題は; 最初の20レコード(つまり最初のページ)を簡単に挿入できます。しかし、ドキュメントごとのページ数を計算するにはどうすればよいですか?また、他のページに対して動的にクエリを実行するにはどうすればよいですか?
これが私のコントローラーとアクションです。最初のページでは機能しますが、他のページでは機能しません。
class Admin::VideosController < ApplicationController
def index
@videos = Video.where(program_id: params[:p_id])
@program = Program.find(params[:p_id])
if params[:cmd]=="get_videos_from_outer"
@page=1
@fetch = Typhoeus::Request.post("URL", :params => {:commandtype=>"getprogramepisodes", :feedtype=>"plist",:id=>@program.kid, :page=>@page})
@plist = Plist::parse_xml(@fetch.body.force_encoding 'utf-8')
import_outer_videos(@plist)
redirect_to :action=>"index", :p_id=>params[:p_id]
end
end
end
そして、ここで私はデータをインスタリングしています:
private
def import_outer_videos(plist)
@total_count = plist.second.first['totalCount']
if !plist.blank?
plist.second.each_with_index do |t, i|
if @page==1
if i > 0
@new = Video.create(:thumb_path=>t['tnPath'], :vid=>t['id'], :title=>t['title'], :type=>t['type'], :kid=>@program.kid, :program_id=>@program.id)
end
else
@new = Video.create(:thumb_path=>t['tnPath'], :vid=>t['id'], :title=>t['title'], :type=>t['type'], :kid=>@program.kid, :program_id=>@program.id)
end
end
@page = @page + 1 unless @page >= @total_count/20 rescue 0
puts "############################### #{@page} - #{@total_count} ###############################"
if @new.errors.blank?
flash[:notice]="Videos has been uploaded."
else
flash[:notice]="No new video."
end
end
end
PS:私はMongoDBとMongoidを使用しています。
助けてくれてありがとう。