我已經得到了這個工作,但是對於一打甚至十幾個文件來說,它很慢(到了超時的時候)。將Dropbox filelist與Ruby on Rails 3中的表內容進行比較的最快速最有效的方式是什麼?
它從保管箱抓取目錄列表,並將其與表格內容進行比較。我想優化它,以便儘可能快速和高效地運行。我知道每次查詢都不是最佳的,但我認爲主要的延遲是Photo.create
方法,因爲這是將文件從保管箱文件夾複製到Amazon S3(通過carrierwave gem
)的地方。我正在考慮在操作上花時間看看延遲來自何處。對於包含10個文件的文件夾,加載該頁面需要一分多鐘。奇怪的是,即使它跳過這些文件也需要很長時間,因爲它們已經存在,這對我來說沒有意義。
這裏是我的控制器代碼:
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
呼叫分成一個異步請求,但是這可能是一個整體「notha事情。現在,如果能夠處理從100個列表中添加5張照片而不超時,我會很高興。
這樣做的最好方法是什麼?我是一名剛剛接觸RoR3的PHP程序員。請幫忙。謝謝!
一個注意:現在,這輸出到一個屏幕,但最終它將是一個後臺操作。
哇......好的。這與我的想法有所不同。我沒有機會嘗試和實施這一點,所以我現在就投票。我有更多的基於PHP的思維模式,所以很高興看到'ruby way'來做事情。我正確地認爲這個類只是位於/lib/eventsync.rb,並且會包含在'require'eventsync''中? – afxjzs
你可以把它放在那裏,但一個很好的做法是隻將代碼放在'lib'中,以便在其他應用程序中重用。這個用例看起來相當具體,所以我可能會把它們放到'app'文件夾中。閱讀Yehuda Katz的[這個問題]的答案(http://stackoverflow.com/questions/1068558/oo-design-in-rails-where-to-put-stuff)瞭解更多信息。 –
印象深刻。這幾乎是直接工作。一個問題:爲'event'和'photo'對象使用'file'引起了一些混淆。非常感謝你的幫助......這很好。 – afxjzs