0

ランダムなバナーを取得するメソッドがありますが、同じバナーを 2 回続けて表示したくありません。

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 呼び出しを行うブログがあり、同じバナーが 2 回続けて表示されます。

4

3 に答える 3

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 に答える
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が指摘しているように、選択できるものを少なくとも 2 つ用意してください。そうしないと、このループが永久に実行されます。場合によっては、フェイルセーフとして、 のような固定長のループ、またはテストと更新が可能なよう10.times doに、これを内部的に行うことで確実に乱数を発行するメソッドのいずれかを使用する方がよい場合があります。@koder.sample(session)

于 2013-01-08T21:02:32.103 に答える
0

以前の ID を random_banner に渡し、一致する場合はランダム ID を拒否できます。選択できるバナーが 1 つしかない場合も、無限ループに陥らないようにする必要があります。

于 2013-01-08T21:02:15.150 に答える