Всё логично же. Сначала создаётся первая связующая модель(id 12), потом при попытке создать вторую видим, что уже с данной записью a существует связь у другой модели из b. Так что, да, оно должно ломаться. Фактически, ваш валидатор проверяет, чтобы у вас была связь one-to-one-through(правда, непонятно зачем такое).
UPD: не объявлены полностью связи в моделях, должно быть так:
class A < ActiveRecord::Base
has_many :ab_relationships, class_name: ABRelationship
has_many :bs, through: :ab_relationships, source: :b
end
class B < ActiveRecord::Base
has_many :ab_relationships, class_name: ABRelationship
has_many :as, through: :ab_relationships, source: :a
end
UPD2: Причины пока неизвестны, но выглядит очень необычно
a = A.create!(b_ids: [1])
B Load (0.2ms) SELECT `bs`.* FROM `bs` WHERE `bs`.`id` = 1 LIMIT 1
(0.1ms) BEGIN
ABRelationship Load (0.4ms) SELECT `ab_relationships`.* FROM `ab_relationships` WHERE `ab_relationships`.`a_id` IS NULL ORDER BY `ab_relationships`.`id` ASC LIMIT 1
SQL (21.7ms) INSERT INTO `as` (`created_at`, `updated_at`) VALUES ('2015-10-10 08:43:24', '2015-10-10 08:43:24')
ABRelationship Load (0.6ms) SELECT `ab_relationships`.* FROM `ab_relationships` WHERE `ab_relationships`.`a_id` = 4 ORDER BY `ab_relationships`.`id` ASC LIMIT 1
SQL (0.5ms) INSERT INTO `ab_relationships` (`b_id`, `a_id`, `created_at`, `updated_at`) VALUES (1, 4, '2015-10-10 08:43:24', '2015-10-10 08:43:24')
ABRelationship Load (0.6ms) SELECT `ab_relationships`.* FROM `ab_relationships` WHERE `ab_relationships`.`a_id` = 4 ORDER BY `ab_relationships`.`id` ASC LIMIT 1
(85.8ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Ab relationships error
UPD3: В итоге, логика Rails сводится здесь к следующему. Создадим запись в связывающей таблице, а потом перед сохранением основной записи запустим все валидации, в том числе и у связанных записей.