ユーザが投票できるアプリがあります。私の設定モデルに保存されている設定に基づいて、24時間あたりの投票総数に制限されています。私の投票モデルで、自分の限界に達したかどうかをチェックして確認するために使用しているコードは次のとおりです。Ruby on Railsアプリでユーザ投票を制限する
def not_voted_too_much?
@votes_per_period = find_settings.votes_per_period #how many votes are allowed per period
@votes = Vote.find_all_by_user_id(user_id, :order => 'id DESC')
@index = @votes_per_period - 1
if @votes.nil?
true
else
if @votes.size < @votes_per_period
true
else
if @votes[@index].created_at + find_settings.voting_period_in_hours.hours > Time.now.utc
false
else
true
end
end
end
end
これが返ってくると、true - 投票が許可されます。 false
の場合 - できません。今は、特定の順序で取得されたレコードに依存し、選択したレコードが最も古いものです。これはうまくいくようですが、私にとっては壊れやすいと感じます。
:order => 'created_at DESC'
を使用したいと思いますが、クエリに制限を適用すると(その期間に投票が許可されているだけの数のレコードを取得する必要があります)、代わりに最も古いレコードが常に引き出されるようです最新のレコードのうち、最も古いものではなく最新の投票を取り出すためにクエリを変更する方法についてはわかりません。
この問題を解決するにはどうすればよいですか?
(これは、ユーザーモデルで正しく
votes
関連のセットアップを持っていると仮定しています)。私はどのようにクエリを実行するのか分からず、 '?'が2番目のパラメタを引っ張ると仮定していますか? – Slick23構文を好む(または多くのパラメータがある)場合は、名前付きプレースホルダを使用することもできます。 'where(" created_at> =:time "、:time => 24.hours.ago)' – idlefingers