Модель рельса: Использование 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