Rails AR проверяет_uniqueness_of на соответствие полиморфному отношению

StackOverflow https://stackoverflow.com/questions/2556598

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Просто расширьте область действия, включив в нее тип с возможностью заполнения:

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

Другие советы

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top