我有一个获取随机横幅的方法,但我不希望它连续两次显示相同的横幅。
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调用来获取横幅代码,并且在那里,相同的横幅连续出现两次。
答案 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。如果只有一个横幅可供选择,你需要确保不会陷入无限循环。