如何将最后两条记录存储在数组中

时间:2013-01-08 20:58:46

标签: ruby-on-rails ruby ruby-on-rails-3.1

我有一个获取随机横幅的方法,但我不希望它连续两次显示相同的横幅。

def random_banner
  @koder = @side.reklamers.all(:select => :id).collect(&:id)
  @koder.sample gets a random ID
  @reklame = Reklamer.find(@koder.sample)
  render :text => @reklame.kode 
end

什么是最佳解决方案?

TDGS解决方案: 当我访问该操作时,它运行良好,但我有一个博客,它使用ajax调用来获取横幅代码,并且在那里,相同的横幅连续出现两次。

3 个答案:

答案 0 :(得分:1)

这样的事情应存储在session而不是数据库中。修改会话几乎是零成本,而修改数据库至少会导致数据库引擎往返并返回,加上创建查询和解码结果的开销。

示例:

loop do
 random_id = @koder.sample

 break if (random_id != session[:last_random_id]))
end

session[:last_random_id] = random_id

正如James Mason指出的那样,确保至少有两件事可以选择,或者这个循环将永远运行。有时,作为故障保护,最好有一个固定长度的循环,如10.times do,或者通过内部执行此操作可靠地发出随机数的方法,因为@koder.sample(session)可以测试和更新。

答案 1 :(得分:1)

将最后使用过的横幅ID存储在会话的某个地方,比如session[:banner_id]

然后,执行以下操作:

@koder = @side.reklamers.pluck(:id).reject{|id| id == session[:banner_id}
@reklame = Reklamer.find(@koder.sample)
session[:banner_id] = @reklame.id

答案 2 :(得分:0)

您可以将之前的ID传递给random_banner,如果匹配则拒绝随机ID。如果只有一个横幅可供选择,你需要确保不会陷入无限循环。