Игнорирование конкретных ошибок проверки
-
21-09-2019 - |
Вопрос
У меня есть Labellings
которые принадлежат Emails
и Labels
.
Каждая метка должна быть уникальной для пары электронное письмо / метка - таким образом, электронное письмо может быть помечено как "тестовое" только один раз.
Я делаю это с validates_uniqueness_of :label_id, :scope => :email_id
.Это работает, как и ожидалось.
Когда я помечаю электронные письма, я хочу добавить маркировку, если она уникальна, и ничего не делать, если электронное письмо уже помечено этой меткой.
Я не хочу дублировать функциональность проверки в моем приложении чем-то вроде:
email.labels << label unless email.labels.include?(label)
Возможно ли гарантировать, что каждая маркировка имеет уникальную пару email_id / label_id без необходимости проверять ее вручную или обрабатывать исключения?
Решение
Я не тестировал это, но вы, вероятно, можете переопределить <<
в прокси-сервере ассоциации, что-то вроде:
class Email < ActiveRecord::Base
has_many :labelings
has_many :labels, :through => :labelings do
def <<(label)
unless proxy_owner.labels.include?(label)
proxy_owner.labelings << Labeling.new(:email => proxy_owner, :label => label)
end
end
end
end