Модель рельса: Использование validates_uniqueness_of с областью действия на атрибутах ассоциированного объекта?

У меня есть модель, определенная как ниже

    class One <Active:Record:Base
    {
         has_and_belongs_to_many :twos, {:join_table => 'map__ones__twos'}
    }

    class Two <Active:Record:Base
    {
         has_and_belongs_to_many :ones, {:join_table => 'map__ones__twos'}
    }

Я хочу, чтобы атрибут имени два был уникальным для области видимости одного. Это означает, что все двое, принадлежащие одному, должны иметь уникальное имя. Здесь я не могу указать некоторые вещи, как показано ниже в модели Two

      validates_uniqueness_of :name, :scope => one_id

потому что on_id не является столбцом таблицы двойок. Скорее one_id и two_id отображаются друг на друга через таблицу map_ones_twos (отношение многие ко многим)

Пожалуйста, предложите

1 ответ

Я часто обнаруживал, что использование has_and_belongs_to_many - больше проблем, чем оно того стоит. Когда у меня есть отношения многие ко многим, я создаю таблицу соединений и создаю модель для нее. Затем модель соединения может иметь проверку уникальности двух идентификаторов.

Извините за имена. Я использую пример таблицы имен из вашего вопроса. В вашем случае это будет выглядеть так:

class MapOnesTwo < ActiveRecord::Base
  belongs_to :one
  belongs_to :two

  validates_presence_of :one_id, :two_id
  validates_uniqueness_of :one_id, :scope => :two_id
end

Ваша модель One выглядит следующим образом:

class One < ActiveRecord::Base
  has_many :ones_twos, :dependent => :destroy
  has_many :twos, :through => :ones_twos
end

И ваша модель Two выглядит так:

class Two < ActiveRecord::Base
  has_many :ones_twos, :dependent => :destroy
  has_many :twos, :through => :ones_twos
end
Другие вопросы по тегам