【问题标题】:acts_as_votable one-to-many and only one option votableact_as_votable 一对多且只有一个选项可投票
【发布时间】:2013-05-24 23:44:42
【问题描述】:

我试图弄清楚如何使用acts_as_votable gem 来实现一个具有一对多关系的投票系统。我有 AgendaItem 模型,它有很多 Conclusion 项目。 Conclusions 可以被用户投票,但他们只能投票给一个。如果他们投票支持第二个结论,则需要改变他们的投票。

有没有什么方法可以在不手动检查用户是否已经投票给conclusion 对象的情况下实现这一点?该文档似乎仅涵盖对单个对象的投票,并且不涵盖与此类似的场景,除非我遗漏了一些东西

【问题讨论】:

    标签: ruby-on-rails-3 activerecord gem


    【解决方案1】:

    您可能想尝试修补ActsAsVotable::Vote 以包含uniqueness validation 的投票。

    module ActsAsVotable
      class Vote < ::ActiveRecord::Base
        validates_uniqueness_of :voter_id, scope: [:votable_id],
          if: Proc.new { |vote| vote.votable_type == "Conclusion" && vote.voter_type == "User" }
      end
    end
    

    您需要在数据库上添加唯一索引:votable_type、:voter_type、:votable_id 和 :voter_id,以最大限度地减少性能损失。

    【讨论】:

    • 嗯,有道理。是否还有一种快速的方法可以简单地将投票从一个更改为另一个,而无需每次都检查?我想我必须自己实现?
    • 您可以像往常一样拨打User#vote_upUser#vote_down。这些方法调用Votable#vote,它检查现有投票并相应地更新投票标志。参考:voter.rbvotable.rb
    • Awesome :) 我已经将该模块添加到我的 lib 目录中(并且我在初始化程序中有一个 require 语句)但是当我检查 Vote 模型以了解它有哪些验证器时,那个没有好像加了?
    • 你明白了吗?我正在尝试完成同样的事情并且运气为零......
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2017-09-10
    • 2016-02-20
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多