2012-04-06 3 views
4

私は投稿用の投票テーブルと投票テーブルを持っています。私は、ユーザーが投票を1回以上断ったり、投票を断ったりすることを確実にするため、投票の中で一意性を検証し、投票したモデルを検証することができます。私は、両方のモデルの間で一意性を検証して、ユーザーが既に投票した投稿を投票できないようにしたい、またはその逆をしたいと思います。 Iveは以下のように定義されたuserfavedカスタム検証を試みましたが、動作しません。Rails - 別のテーブルに基づいて一意性を確認する

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 
+0

あなたがこれを尋ねて以来、しばらくお待ちしていますが、投票の種類(上または下)を表す列で1つの表を使用していないのはなぜですか?複雑な検証が不要になります。すでに行ったように ':user_id、:scope =>:article_id'の一意性だけを検証する必要があります。 –

答えて

2

バグがあなたの検証でありますように見えます:あなたがwhereに渡しているハッシュの値はシンボルです。次のように変更し、それが動作するはずです:

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

しかし、私はこれを行うための簡単な方法があると思います。 1つのテーブルVotesを持っていて、それが上か下かを記録する属性を追加できますか?それはあなたの一意性チェックを非常に簡単にします。別のクラスを実際に使用する場合は、単一テーブル継承を使用できます。votesテーブル、スーパークラスVote、および2つのサブクラスVoteUpおよびVoteDownを持つことができます。

+0

別のモデルからデータを取り出すことは可能ですか(投票モデルのVotedownでwhereフィルタを実行します)? –

+0

私が提案した階層を使用する場合、VoteUp.where(...)はVoteUpエントリを、VoteDown.where(...)はVoteDownエントリを、Vote.where(...)は両方を検索します。単一テーブル継承の詳細はこちらをご覧ください:http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/ – tsherif

+0

コメントありがとうございます。その有用なしかし私は私が仕事を持っていることを、おそらくコントローラを介してしようとするつもりです。 –