(Rails 4.2.1, Sqlite3) У меня есть три модели — M1, M2, M3.
M1 принадлежит M2
M1 также принадлежит M3
M1 имеет поле :name (строка).
У меня есть следующие ограничения, которые должны быть проверены:
1) С записью M1 может быть связана запись M2 или M3, но не обе одновременно.
2) Имя M1 должно быть уникальным в зависимости от того, какой из M2 или M3 указан.
Я реализовал ограничение (1) в модели, и оно работает так, как ожидалось. (Я упоминаю об этом только потому, что это может иметь отношение к сценарию).
Для ограничения (2) я добавил индекс в миграцию следующим образом:
add_index :m1s, [:name, :m2_id, :m3_id], unique: true, name: "idx_m1_name"
Тогда я звоню:
> m2 = M2.create! # success
> m1_1 = M1.create!(name: 'm1_1', m2: m2) #success
> m1_2 = M1.create!(name: 'm1_1', m2: m2) # this line should fail, but doesn't
Создаются m1_1 и m1_2 - я ожидаю, что m1_2 должен потерпеть неудачу из-за ограничения уникальности.
Я проверил, что индекс добавляется, как и ожидалось. Кроме того, согласно ограничению 1, m3_id равен нулю как в m1_1, так и в m1_2, не уверен, что это актуально.
Почему ограничение не проверяется?