【问题标题】:What is the most efficient way to generate a link in a Rails partial?在 Rails 部分中生成链接的最有效方法是什么?
【发布时间】:2013-10-25 14:05:15
【问题描述】:

我的应用会生成一个用户日历,其中包含可用于预约的空档。它会自动检测访问者的时区,并在访问者的时区显示用户的可用性。

由于检测到的时区用于渲染显示,片段缓存将不起作用。

该视图生成 100 多个链接,访问者可以选择这些链接来预订预约时间段。基准测试表明,生成链接是视图中最慢的部分 - 每个链接大约需要 0.5 毫秒

循环ERB和生成超链接最有效的方法是什么?

我们开始使用 HTML 而不是 link_to Rails 助手 - 这在开发中快了 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 是一个字符串。它们不会在循环中更改 - 也就是说,它们是在页面呈现时生成并且不会更改。

event_id 是一个整数,timeslot 是一个时间。它们对于循环中的每个链接都是不同的。

我想知道是否存在基于字符串缓冲工作原理在 Ruby/Rails 中生成此 HTML 链接的最佳方法。

循环是一个整数范围,每天运行,

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

另外,在 Rails 中是否有一种不依赖 ERB 的更快方法来执行此操作?

【问题讨论】:

  • 你每次如何定义event_idtimeslot

标签: ruby-on-rails ruby performance heroku erb


【解决方案1】:

你可以试试这样的:

# 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有关。

【讨论】:

  • 谢谢。我尝试了该解决方案,但没有看到明显的性能提升。我认为有人可能对 Ruby/Rails 如何与字符串一起工作有一些较低级别的知识,以便为我指出最佳模式。如上所述,event_id 是一个整数,timeslot 是一个时间。 event_id 来自哈希。我一直在倾注每一行,找不到比这个链接更慢的东西。再次感谢。
  • 使用上面的代码,仅注释掉href 部分,对其进行基准测试,然后仅注释掉timeslot 部分,对其进行基准测试,然后同时注释掉两者并对其进行基准测试。这应该让您了解问题所在。
  • 谢谢。不幸的是,我今天做了一些优化——通常情况下——没有“确凿证据”。只需逐行浏览代码并寻找低效率的问题。但是谢谢你,你的回答就是我的问题。
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 2011-08-12
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多