Rails AR validates_uniqueness_of против полиморфных отношений - PullRequest
10 голосов
/ 01 апреля 2010

Можно ли проверить уникальность атрибута дочерней модели, ограниченного полиморфными отношениями?

Например, у меня есть модель с именем field, которая принадлежит fieldable:

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

У меня есть несколько других моделей (Страницы, Предметы), которые имеют много полей. Поэтому я хочу проверить уникальность имени поля по сравнению с родительской моделью, но проблема в том, что иногда Страница и Элемент имеют один и тот же идентификационный номер, что приводит к сбою валидации, когда они не должны.

Я просто делаю это неправильно или есть лучший способ сделать это?

Ответы [ 2 ]

21 голосов
/ 01 апреля 2010

Просто расширите область, чтобы включить поле типа:

class Field < ActiveRecord::Base
  belongs_to :fieldable, :polymorphic => :true
  validates_uniqueness_of :name, :scope => [:fieldable_id, :fieldable_type]
end
0 голосов
/ 10 июня 2016

Вы также можете добавить сообщение, чтобы переопределить сообщение по умолчанию, или использовать область для добавления проверки:

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'

Вы собираетесь заменить «тему» ​​по умолчанию, которую рельсы добавляют к ошибкам, той, которую вы указали здесь. Поэтому вместо того, чтобы сказать: Fieldable Id has been already taken или около того, он сказал бы:

 Field cannot be duplicated
...