Rails如何渲染第一个和之后调用方法?

时间:2013-07-08 16:47:20

标签: ruby-on-rails ruby-on-rails-3.2

我在我的控制器中有这个动作:

def ad

    @koder = @side.reklamers.pluck(:id) - [session[:log]]
    @reklame = Reklamer.find(@koder.sample)
    session[:log] = @reklame.id
    render :text => "<span class='bannerid' data-id='#{@reklame.id}'></span><p style='margin-bottom: 7px;margin-top: 7px;font-size: 9px;text-align: center !important;'>Ad</p>#{@reklame.kode}"

 end

它呈现HTML广告。这段代码非常快。问题是,当我尝试示例计数视图时,响应变得非常慢。 3秒。相比200ms!

@koder = @side.reklamers.pluck(:id) - [session[:log]]
@reklame = Reklamer.find(@koder.sample)
session[:log] = @reklame.id
@reklame.views += 1
@reklame.save
render :text => "<span class='bannerid' data-id='#{@reklame.id}'></span><p style='margin-bottom: 7px;margin-top: 7px;font-size: 9px;text-align: center !important;'>Ad</p>#{@reklame.kode}"

我尝试添加具有相同结果的resque后台作业..

我该怎么办?

2 个答案:

答案 0 :(得分:2)

由于views真的是一个反击,你应该看看:

http://apidock.com/rails/v3.2.13/ActiveRecord/CounterCache/increment_counter

在你的情况下它应该是这样的

Reklamer.increment_counter(:views, @reklame.id)

它应该只更新视图列,不运行验证,回调等,这将使它更快。但另一方面,简单保存的3s表示还存在其他问题。

答案 1 :(得分:0)

首先,试试:

@reklame.update_attribute :views, @reklame.views + 1

看看是否有帮助。如果是这样,那么你有一些昂贵的数据验证正在减慢你的速度,但至少你知道问题的根源。

如果这不起作用,请尝试在

中包装该语句
Thread.new { //code }

如果执行保存仍然很慢,那么可能是您的数据库设置方式或类似的方式。