Модель рельса: Использование validates_uniqueness_of с областью действия на атрибутах связанного объекта? - PullRequest
1 голос
/ 21 марта 2011

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

    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'}
    }

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

      validates_uniqueness_of :name, :scope => one_id

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

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

1 Ответ

1 голос
/ 24 марта 2011

Я часто обнаруживал, что использование 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 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
...