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