2013-10-25 152 views
1

我的應用程序會生成用戶的日曆,其中包含可用於預約約會的插槽。它會自動檢測訪客的時區,並在訪客的時區顯示用戶的可用性。在Rails部分中生成鏈接的最有效方法是什麼?

由於檢測到的時區用於渲染顯示,因此片段緩存將不起作用。

該視圖生成100多個鏈接,訪問者可以選擇該鏈接預訂約會的時間段。基準測試顯示,生成鏈接是視圖中速度最慢的部分 - 每個鏈接需要大約0.5ms

通過ERB循環並生成超鏈接的最有效方法是什麼?

我們開始使用HTML代替link_to Rails幫助程序 - 開發速度提高了2倍,但生產率提高了2倍 - 我們的結論是Heroku必須優化這些Rails幫助程序。

<a href="/<%= @profile.profile_url %>/ 
appointments_calendars/<%= @appointments_calendar.id %>/ 
booked_events/new? 
timezone_name=<%= @timezone.name %>&amp; 
event_slot_id=<%= event_id %>" 
class="left-slot open-slot" rel="nofollow"> 
<%= timeslot.strftime("%l:%M%p") %></a> 

其中 @ profile.profile_url字符串,@ appointments_calendar.id是從ActiveRecord對象的整數。 @ timezone.name是一個字符串。它們不會在循環中更改 - 也就是說,它們在頁面呈現時不會更改而生成。

事項標識是一個整數,時隙是時間。循環中的每個鏈接都不相同。

我想知道是否有一種最佳的方式來在Ruby/Rails中根據字符串緩衝的工作原理生成此HTML鏈接。

的循環是每天運行的整數範圍,

(first_hour..last_hour).step(1.hour).each 

另外,有一個更快的方式在不依賴於僱員再培訓局的Rails這樣做呢?

+0

你是如何定義'event_id'和'timeslot'每次? – tyler

回答

2

你可以嘗試這樣的:

# somewhere before the loop starts: 
<% slug = "/#{@profile.profile_url}/appointments_calendars/#{@appointments_calendar.id}/booked_events/new?timezone_name=#{@timezone.name}&amp;event_slot_id=" %> 

那麼你可以做

<a href="<%= slug + event_id %>" class="left-slot open-slot" rel="nofollow"> 
    <%= timeslot.strftime("%l:%M%p") %> 
</a> 

,我不知道這是否會成爲瓶頸與否雖然這將是更具可讀性。我懷疑生成鏈接的時間很長也可能與您定義的event_idtimeslot有關。

+0

謝謝。我玩過這個解決方案,但沒有看到明顯的性能增益。我認爲有人可能會有一些關於Ruby/Rails如何使用字符串的較低級知識來指向最佳模式。如上所述,event_id是一個整數,時隙是一個時間。 event_id來自一個散列。我一直在傾注每一行,並且沒有比這個鏈接慢的東西。再次感謝。 –

+0

使用上面的代碼,只註釋'href'部分,對其進行基準測試,然後僅註釋'timeslot'部分,對其進行基準測試,然後同時對兩者進行註釋並進行基準測試。這應該讓你知道問題出在哪裏。 – tyler

+0

謝謝。不幸的是,我今天做了一些優化 - 就像通常那樣 - 沒有「吸菸槍」。只需通過代碼逐行執行並尋找低效率即可。但是,謝謝你,你的回答是我的問題。 –

相關問題