9

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

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

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

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

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

ответ

20

Просто расширить сферу включать fieldable тип:

class Field < ActiveRecord::Base 
    belongs_to :fieldable, :polymorphic => :true 
    validates_uniqueness_of :name, :scope => [:fieldable_id, :fieldable_type] 
end 
+1

Спасибо. Симпсоны, когда вы знаете, как :) – aaronrussell

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' 

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

Field cannot be duplicated 
Смежные вопросы