0

外部APIから大量のXMLデータを取得しています。

1ページあたり20レコードのページ付けされたすべてのデータが得られます。

また、各ドキュメントの合計レコード数もわかります。

XML(実際にはplist data)をgemで取得し、Typhoeusgemで変換して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を使用しています。

助けてくれてありがとう。

4

1 に答える 1

1

私は自分でそれを解決しました。これは、似たようなことをする必要があるかもしれない人のための私の解決策です.

def get_videos_from_outer(page=params[:page], kid=params[:kid], totalCount="")

        @videos = Video.where(program_id: params[:p_id])
        @program = Program.find(params[:p_id])

        @fetch = Typhoeus::Request.post("URL", :params => {:commandtype=>"getprogramepisodes", :feedtype=>"plist",:id=>kid.to_i, :page=>page.to_i})
        @plist = Plist::parse_xml(@fetch.body.force_encoding 'utf-8')



          @totalCount = @plist.second.first['totalCount']

          if !totalCount.blank?
            @totalCount = totalCount
          end
        import_outer_videos(@plist, kid, page.to_i, @totalCount.to_i)

  end

そしてimport_outer_videos方法。

private

def import_outer_videos(plist, kid, page, totalCount)

         @totalCount = totalCount

        plist.second.each_with_index do |t, i| 
        # First page has odd data and here we're getting rid off them
                if page.to_i==1
                   if i > 0
                   @new = Video.create(:thumb_path=>t['tnPath'], :vid=>t['id'], :title=>t['title'], :type=>t['type'], :kid=>kid, :program_id=>@program.id)

                    end
                else
                  @new = Video.create(:thumb_path=>t['tnPath'], :vid=>t['id'], :title=>t['title'], :type=>t['type'], :kid=>kid, :program_id=>@program.id)       

                end

        end

        if page.to_i < (@totalCount.to_i/20) + 1
        page = page.to_i + 1 

        get_videos_from_outer(page.to_i, kid.to_i, @totalCount)
        else
          redirect_to :action=>"index", :p_id=>params[:p_id]
        end

          if @new.errors.blank?
          flash[:notice]="#{@totalCount} videos has been transfered."
          else
            flash[:notice]="No new video."
          end
end
于 2012-12-10T11:00:07.883 に答える