2011-02-01 84 views
1

ユーザが投票できるアプリがあります。私の設定モデルに保存されている設定に基づいて、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'を使用したいと思いますが、クエリに制限を適用すると(その期間に投票が許可されているだけの数のレコードを取得する必要があります)、代わりに最も古いレコードが常に引き出されるようです最新のレコードのうち、最も古いものではなく最新の投票を取り出すためにクエリを変更する方法についてはわかりません。

この問題を解決するにはどうすればよいですか?

答えて

0

あなたは24時間以上経過したユーザーの投票を数えて制限することはできませんか?何か不足していますか?

def not_voted_too_much? 
    votes_count = votes.where("created_at >= ?", 24.hours.ago).count 
    votes_count < find_settings.votes_per_period 
end 

うん、これは私が探していたものである

+0

(これは、ユーザーモデルで正しくvotes関連のセ​​ットアップを持っていると仮定しています)。私はどのようにクエリを実行するのか分からず、 '?'が2番目のパラメタを引っ張ると仮定していますか? – Slick23

+0

構文を好む(または多くのパラメータがある)場合は、名前付きプレースホルダを使用することもできます。 'where(" created_at> =:time "、:time => 24.hours.ago)' – idlefingers

関連する問題