我有以下 mongoid 模型,具有范围验证以防止对一项法案进行多次投票。每个投票属于一个用户和一个组:
类(class)投票
包括 Mongoid::Document
field :value, :type => Symbol # 可以是:aye, :nay, :abstain
field :type, :type => Symbol # TODO 可以删除吗?
归属地:用户
归属地:polco_group
嵌入:账单
validates_uniqueness_of :value, :scope => [:polco_group_id, :user_id, :type]
结尾
用户可以使用以下方法为账单添加投票:
def vote_on(账单,值(value))
if my_groups = self.polco_groups # 测试以确保用户是组的成员
my_groups.each 做 |g|
# TODO 查看是否已经投票
bill.votes.create(:value => value, :user_id => self.id, :polco_group_id => g.id, :type => g.type)
结尾
别的
提出“此用户没有 polco_groups”##{self.full_name}”
结尾
结尾
和一个嵌入了许多 :votes 的 Bill 类。这旨在允许用户将他们的投票与不同的组(“Ruby Coders”、“Women”等)相关联,并且运行良好,但数据库目前允许用户对一项法案进行多次投票。我怎样才能让以下工作?
u = 用户.last
b = 比尔.last
u.vote_on(b,:nay)
u.vote_on(b,:nay) -> 应该返回一个验证错误
最佳答案
最有可能的验证器位于 Vote
不会被解雇。您可以通过添加验证函数并输出某些内容或在其中引发异常来确认这一点。
class Vote
validate :dummy_validator_to_confirmation
def dummy_validator_to_confirmation
raise "What the hell, it is being called, then why my validations are not working?"
end
end
如果在创建上述验证后
User#vote_on
不会引发异常,它确认没有为 Vote
触发回调通过 vote_on
方法。您需要更改代码以在 Vote
上触发回调.可能将其更改为类似于以下内容会有所帮助:def vote_on(bill, value)
if my_groups = self.polco_groups # test to make sure the user is a member of a group
my_groups.each do |g|
# TODO see if already voted
vote = bill.votes.new(:value => value, :user_id => self.id, :polco_group_id => g.id, :type => g.type)
vote.save
end
else
raise "no polco_groups for this user" # #{self.full_name}"
end
end
有一个open issue在 mongoid github 问题跟踪器上,允许对嵌入文档进行级联回调。现在回调仅在发生持久性操作的文档上触发。
关于ruby-on-rails - 具有范围和belongs_to的Mongoid验证唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6995779/