5

投稿用の投票表と投票表があります。投票モデルと投票モデル内の一意性を検証して、ユーザーが複数回投票または投票できないようにすることができます。ユーザーがすでに投票した投稿に投票できないように、またはその逆にできるように、両方のモデルの一意性を検証したいと思います。以下に定義されているuserfavedのカスタム検証を試しましたが、機能しません。

 class Vote < ActiveRecord::Base

 validates_uniqueness_of :user_id,  :scope => :article_id #allows only one vote

 validate :userfaved

 def userfaved
  if Votedown.where( :user_id => :user_id, :artcle_id => :article_id).any?
      errors.add(:user_id, 'already voted on this') 
  end
 end



class Votedown < ActiveRecord::Base

validates_uniqueness_of :user_id, :scope => :article_id #allows only one votedown

validate :userfaved

def userfaved
    if Vote.where(:user_id=> :user_id, :article_id => :article_id).any?
        errors.add(:user_id, 'already voted on this')
    end
end
4

1 に答える 1

2

検証にバグがあるようです。渡すハッシュの値whereはシンボルです。次のように変更すると、機能するはずです。

Votedown.where( :user_id => self.user_id, :article_id => self.article_id).any?

しかし、これを行うにはもっと簡単な方法があると思います。テーブルを1つだけ作成し、そのテーブルVotesにアップかダウンかを記録する属性を追加できますか?これにより、一意性のチェックが非常に簡単になります。本当に個別のクラスが必要な場合は、単一テーブル継承を使用できます。つまり、votesテーブル、スーパークラスVote、および2つのサブクラスVoteUpVoteDown

于 2012-04-06T22:04:15.627 に答える