ruby-on-rails - 具有范围和belongs_to的Mongoid验证唯一性

标签 ruby-on-rails ruby-on-rails-3 validation mongoid

我有以下 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/

相关文章:

ruby-on-rails - 使用 acts-as-taggable-on gem 通过关联排序

javascript 验证仅适用于字母值

ruby-on-rails - WEBrick Rails 服务器冗长

ruby-on-rails - 关联关联的 Rails 作用域

ruby-on-rails-3 - 使用 Oauth 2 为用户建模

ruby-on-rails-3 - Rails 3 - 默认范围

php - 验证我的表单和标题到另一个成功页面

css - 模仿 HTML5 表单验证默认样式

ruby-on-rails - RSpec 的让!等效于 ActiveSupport::TestCase

ruby-on-rails - 如何部署无法使用 Capistrano 进行版本控制的许可字体?