私はこれを機能させていますが、1ダースほどのファイルでも非常に遅いです(タイムアウトになるまで)。
ドロップボックスからディレクトリリストを取得し、それをテーブルの内容と比較します。これを最適化して、可能な限り高速かつ効率的に実行できるようにしたいと思います。毎回クエリを実行するのが最適ではないことはわかっていPhoto.create
ますが、ドロップボックスフォルダーからAmazon S3に(を介してcarrierwave gem
)ファイルをコピーするため、メソッド中に大きな遅延が発生すると思います。遅延がどこから来ているのかを確認するために、操作に時間をかけることを検討しています。10個のファイルがあるフォルダの場合、ページの読み込みに1分以上かかります。奇妙なことに、それらのファイルはすでに存在しているためにスキップしても、これほど時間がかかるので、私には意味がありません。
これが私のコントローラーコードです:
def sync
photo_size = 1024
@event = Event.find(params[:id])
@client = Dropbox::API::Client.new(:token => 'derp', :secret => 'herp')
@dropbox_files = @client.ls "images/#{@event.keyword}/#{photo_size}/"
@existing_photos = @event.photos.all
@data = []
# TODO: need to make it not add files multiple times
@dropbox_files.each do |f|
photo_exists = Photo.where(:dropbox_path => f.direct_url.url).count
if photo_exists == 0
@photo = Photo.create(:remote_filename_url => f.direct_url.url,
:dropbox_path => f.direct_url.url,
:event_id => @event.id)
@data << "Added: #{f.direct_url.url.split('/').last}"
else
@data << "Skipped: #{f.direct_url.url.split('/').last}"
end
end
end
理想的には、各呼び出しを非同期リクエストに分割したいのですPhoto.create
が、それはまったくのことではないかもしれません。今のところ、100枚のリストから5枚の写真をタイムアウトせずに追加できるものであれば嬉しいです。
これを行うための最良の方法は何ですか?私はRoR3を初めて使用するPHPプログラマーです。助けてください。ありがとう!
注:今のところ、これは画面に出力されますが、最終的にはバックグラウンドアクションになります。