2012-04-06 58 views
4

我有投票和投票表格的投票。我可以在投票和投票模式中验证唯一性,以确保用户不能投票或投票超过一次。我想验证这两种模式的独特性,以便用户不会投票选出他们已经投票过的帖子,反之亦然。我试过了下面定义的自定义验证,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

我知道这已经有一段时间了,因为你问了这个问题,但我想知道为什么你不只是使用一张表代表投票类型的列(上或下)?这将消除您对复杂验证的需求。你只需要像你已经完成的那样验证':user_id,:scope =>:article_id'的唯一性。 – 2013-08-30 02:15:36

回答

2

它看起来像有在你验证了一个错误:在哈希你传递给where值是符号。它更改为以下,它应该工作:

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

但我认为有一个简单的方法来做到这一点。你可以只有一个表Votes并添加一个属性,记录它是否是向上或向下?这会让你的独特性检查变得非常简单。如果你真的想为它分开类,你可以使用单表继承:有一个votes表,一个超类Vote,和两个子类VoteUpVoteDown

+0

是否有可能从另一个模型中提取数据(即在Vote模型中运行Votedown上的where过滤器)? – 2012-04-07 01:50:27

+0

如果您使用我建议的层次结构,则VoteUp.where(...)将查找VoteUp条目,VoteDown.where(...)将查找VoteDown条目,并且Vote.where(...)将查找这两个条目。有关单表继承的更多信息,请访问:http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/ – tsherif 2012-04-07 04:58:04

+0

感谢您的评论;它的帮助,但我会试图让我有工作,可能通过控制器。 – 2012-04-07 13:24:02