0

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

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 调用以获取横幅代码,并且在那里,相同的横幅连续出现两次。

4

3 回答 3

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)测试和更新。

于 2013-01-08T21:02:32.103 回答
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
于 2013-01-08T21:18:09.917 回答
0

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

于 2013-01-08T21:02:15.150 回答