Ruby on rails 3 多态表上具有作用域的Rails 3唯一性验证

Ruby on rails 3 多态表上具有作用域的Rails 3唯一性验证,ruby-on-rails-3,validation,unique,Ruby On Rails 3,Validation,Unique,我有以下设置: class Vote < ActiveRecord::Base belongs_to :voteable, :polymorphic => :true, :counter_cache => true end class Proposition < ActiveRecord::Base has_many :votes, :as => :voteable end class Winner < ActiveRecord::Base h

我有以下设置:

class Vote < ActiveRecord::Base
  belongs_to :voteable, :polymorphic => :true, :counter_cache => true
end

class Proposition < ActiveRecord::Base
  has_many :votes, :as => :voteable
end

class Winner < ActiveRecord::Base
  has_many :votes, :as => :voteable
end
我想验证以下内容。具有给定ip_地址的用户只能对一个提案进行投票。因此ip_地址、voteable_id和voteable_类型的组合必须是唯一的


如何使用“简单”的验证规则实现这一点?

为了保证唯一性,您必须向数据库中添加唯一索引

如果您还没有重要的数据,可以在迁移中使用


如果您已经有了一些数据,那么可以使用SQL完成,这取决于您的DBMS来保证唯一性,您必须向数据库中添加唯一索引

如果您还没有重要的数据,可以在迁移中使用


如果您已经有一些数据,则可以使用SQL完成,这取决于您的DBMS

将范围添加到唯一的
:ip_地址
验证

class Vote < ActiveRecord::Base
  # ...
  validates :ip_address, uniqueness: { scope: [:voteable_type, :voteable_id]}
end
类投票
将作用域添加到唯一的
:ip\U地址
验证

class Vote < ActiveRecord::Base
  # ...
  validates :ip_address, uniqueness: { scope: [:voteable_type, :voteable_id]}
end
类投票
性能是否良好取决于您自己,您可以将其保留,因为这并不能回答问题。提问者希望得到验证。如果这种情况下确实没有特定的验证,那么答案就是只进行自定义验证。这可能是也可能不是“最佳”方式(取决于具体情况),但进行DB约束与验证是两码事。性能是否良好取决于您自己,您可能会放弃,因为这并不能回答问题。提问者希望得到验证。如果这种情况下确实没有特定的验证,那么答案就是只进行自定义验证。这可能是也可能不是“最佳”方式(取决于具体情况),但进行DB约束与验证是两码事。
class Vote < ActiveRecord::Base
  # ...
  validates :ip_address, uniqueness: { scope: [:voteable_type, :voteable_id]}
end