where.notとsampleを組み合わせる方法を思いつきました。
ruby
1def random_user_except(skip_user_ids)
2 @user = User.where.not(id: skip_user_ids).sample
3end
スキップしたいidを決めることができるなら、これで完了です。
ただ、問題はそのスキップすべきidをどうデータとして持つか?ということだと思います。本当はキャッシュでうまく処理できるのが理想ですが、よく分からなければデータベースで保持しちゃうというやり方でも良いのではないかと思っています。
テーブルの設計としてはフォロー/フォロワーの中間テーブルと同じように、取得するユーザ/取得されたユーザ(displayed_user)のような中間テーブルを作ります(仮にrandom_user_display_journalsとしておきます)。
で、created_atを見て、skipするidかどうかを決める、みたいなロジックを組みます。
以下はサンプルコードです。
(雰囲気で書きましたし、とくに確認などはしていない点、ご了承ください;;)
ruby
1def random_user_display
2 time = (適切に決める)
3 random_user_display_journals = current_user.random_user_display_journals.where(created_at: time..Float::INFINITY)
4 skip_user_ids = random_user_display_journals.pluck(:id).concat(current_user.id)
5 @user = User.where.not(id: skip_user_ids).sample
6 current_user.random_user_display_journals.create(displayed_user: @user.id)
7end