1

わかりました。レビューモデルと投票モデルがあります(賛成票と反対票は、単一の変数「いいね」でモデル化されています。真の場合は賛成、偽の場合は反対です)。投票はhas_many関係であり、多態的です(後でレビューだけでなく、これを使用できるようにしたいと思います)。

したがって、レビューモデルには次の行があります

 has_many :votes, :as => :votable

そして、投票モデルは次のように定義されます

class Vote < ActiveRecord::Base
  belongs_to :votable, :polymorphic => true
  belongs_to :user

  def upvote?
    like
  end

  def downvote?
    !like
  end
end

これで問題ありません。賛成、反対、投票を削除できます。しかし、私は賛成票と反対票に基づいたスコアを生成しようとしています(単に賛成票-今のところ反対票)。これを行うために、レビューモデルに以下を追加しました

def score
  up = 0
  down = 0
  self.votes.each do |v|
    if v.upvote?
      up += 1
    elsif v.downvote?
      down += 1
    end
  end
  up-down
end

しかし、私は常に答えとして0を返します。up変数またはdown変数をその外側に設定して通過させることができるため、エラーはループ内にあります。それは私を狂気に駆り立て始めました、そして私はどこが間違っているのか分かりません。

4

2 に答える 2

1

手始めに、データベースを使用して、名前付きスコープでの反対票と賛成票の数を数えるのが最善かもしれません。

次に、合計数を取得したら、賛成票から反対票を差し引くことができます。

スコープの詳細については、http://guides.rubyonrails.org/active_record_querying.html#scopesを参照してください。

于 2012-05-28T23:04:40.977 に答える
0

エラーがループ内にあることが確実な場合は、次のように推測します。

あなたはv.upvoteを持っていますか?ifとして、およびv.downvote?elsifとして。

これらの両方が偽の場合はどうなりますか?私は何も起こらないとかなり確信しています。したがって、0-0 = 0であり、常にゼロが返されます。あなたのv.upvoteなら、ループは完全に問題ありませんか?とv.downvote?正しく書かれているか、そもそも正しい値です。

試す:

if v.upvote?
 ...
else
 ...
end

明らかに、あなたは理由のためにそのようにそれらのセットアップを持っています、しかしあなたはおそらく間違ったことにゾーニングしているだけです。

お役に立てれば。

于 2012-05-29T03:47:18.887 に答える