(Rails 4.2.1, Sqlite3) У меня есть три модели - M1, M2, M3.Уникальный индекс, когда один из двух столбцов равен нулю
M1 M2 belongs_to
M1 и M3 belongs_to
М1 имеет: имя (строка) поле.
у меня есть следующие ограничения, которые должны быть проверены:
1) М1 запись может иметь М2 или М3 связаны, но не оба.
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 равно nil как в m1_1, так и в m1_2, не уверен, что это релевантно.
Почему ограничение не проверяется?
Спасибо, я подозревал нулевое значение, но ваш ответ и ссылка подтверждают это :-)! Итак, как я могу проверить ограничение единственности (2) выше в базе данных? – Anand
hmm, так что вы можете иметь M2 или M3, но не оба. Вы считали, что вместо этого используете полиморфные отношения? http://guides.rubyonrails.org/association_basics.html#polymorphic-associations –
https://stackoverflow.com/questions/12094479/how-to-set-unique-constraint-over-multiple-column-when-any- возможно одно-can-be-null-in-sq, но hacky –