10

是否可以根据多态关系验证子模型属性的唯一性?

例如,我有一个名为的模型field属于fieldable

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :name, :scope => :fieldable_id
end

我有几个其他模型(页面、项目),它们有很多字段。所以我想要的是针对父模型验证字段名称的唯一性,但问题是有时 Page 和 Item 共享相同的 ID 号,导致验证在不应该失败时失败。

我只是做错了还是有更好的方法来做到这一点?

4

2 回答 2

22

只需扩大范围以包括可字段类型:

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :name, :scope => [:fieldable_id, :fieldable_type]
end
于 2010-03-31T21:47:56.800 回答
0

您还可以添加一条消息来覆盖默认消息,或者使用范围来添加验证:

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :fieldable_id, :scope => [:fieldable_id, :fieldable_type], :message => 'cannot be duplicated'
end

作为奖励,如果您访问 en.yml,然后输入:

  activerecord:
    attributes:
     field:
       fieldable_id: 'Field'

您将用您在此处指定的主题替换 rails 添加到错误中的默认“主题”。因此,与其说:Fieldable Id has been already taken左右,不如说:

 Field cannot be duplicated
于 2016-06-10T18:45:02.090 回答